Scala学习笔记总结
Scala学习网站:https://www.runoob.com/scala/scala-intro.html
scala总结: Scala编程语言学习总结_hjy1821的博客-CSDN博客_scala学习
1、使用scala实现wordCount
scala> import scala.io.Source
scala> val lines =
Source.fromFile("/usr/local/src/badou_code/mr/mr_wc/The_Man_of_Property.txt").getLines
lines: Iterator[String] = non-empty iterator
Iterator it 这是一个迭代器
it.next(): 获取迭代器中下一个元素
it.hasNext():判断集合中是否还有元素
最简单采用while循环进行遍历
scala> val lines = Source.fromFile("/usr/local/src/badou_code/mr/mr_wc/The_Man_of_Property.txt").getLines.toList
toList: 将上面迭代器中放入列表中进行返回
scala> lines.length 和 wc -l The_Man_of_Property.txt 返回的数据结果一致
res0: Int = 2866
需要对每一行的数据进行单词的切割(提取单词)
// select split(sentence,' ') re
// from tmp
------------------------------------
理解Range:
定义:可以理解为一个序列
Range 就是区间类型
scala> val a = Range(0,5) [0,5) 步长是1
a: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)
等价于
val b = 0 until 5
包含起始
scala> val c = 1 to 5 <==> val d = 1.to(5)
Range转换为List:
a.toList
val list1 = (1 to 10).toList
------------------------------------
理解map:
scala> a.map(x=>x*2) <==> a.map(_*2) 对每个元素进行遍历操作 *2
理解Vector: 可以认为是保存数据的容器,也称为集合
1、创建Vector 对象
scala> val v1 =Vector(1,2,3)
获取 Vector元素 索引下标从0 开始
scala> println(v1(0))
2、Vector 遍历
scala> for(i<- v1) print(i+" ")
1 2 3
------------------------------------
理解_:
作用是通配符
(1)集合中每一个元素
a.map(_*2)
(2)获取tuple中的元素
scala> val s = ("hello","badou")
s: (String, String) = (hello,badou)
s._1 s._2
(3) 导入所有包
import scala.collection.immutable.xxx 指定具体包
import scala.collection.immutable._
(4)初始化变量
val a=1 定义的变量不能被修改 , var可以修改
scala> var name:String=_
name: String = null
scala> var score:Int=_
score: Int = 0
------------------------------------
理解split:
scala> val s = "The Man of Property"
scala> s.split(" ")
res18: Array[String] = Array(The, Man, of, Property)
------------------------------------
结合:
scala> lines.map(x=>x.split(" "))
scala> lines.map(_.split(" "))
返回的是List (Array(), Array*()...) ?
目标:将Array进行打平
理解flatten函数
scala> val s1 = List(Range(0,5), Range(0,5), Range(0,5))
scala> val s2 = s1.flatten
s2: List[Int] = List(0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4)
每个元素遍历操作
s2.map(x=>x+2)
s2.map(_+2)
直接针对s1进行处理
scala> s1.map(x=>x.map(x=>x*2))
scala> s1.map(_.map(_*2))
将Vector进行打散
scala> s1.flatMap(_.map(_*2))
等价于
scala> s1.map(_.map(_*2)).flatten
res30: List[Int] = List(0, 2, 4, 6, 8, 0, 2, 4, 6, 8, 0, 2, 4, 6, 8)
映射到lines
map + flatten <==> flatMap
scala> lines.map(x=>x.split(" ")).flatten
scala> lines.flatMap(_.split(" "))
MR Map:
scala> lines.flatMap(x=>x.split(" ")).map(x=>(x,1))
scala> lines.flatMap(_.split(" ")).map(x=>(x,1))
scala> lines.flatMap(_.split(" ")).map((_,1))
scala> lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1)
res36: scala.collection.immutable.Map[String,List[(String, Int)]] =
Map(forgotten -> List((forgotten,1), (forgotten,1), (forgotten,1)))
从tuple 中(forgotten,1) 获取第一个单词 forgotten 作为key
将整个tuple作为value,收集到一个List中
这样对应的value
_1: forgotten _2: List((forgotten,1), (forgotten,1), (forgotten,1))
整个list的大小,就是forgotten 出现的次数
scala> lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).map(x=>(x._1, x._2.length))
等价于
scala> lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).map(x=>(x._1, x._2.size))
理解数组求和的方式:
scala> val a1 = List((1,2), (3,4),(5,6))
scala> a1.map(_._2).sum
scala> a1.map(_._2).reduce(_+_)
reduce(_+_)计算原理:
List(1,1,1) => ((1+1)+1) => sum +=x
scala> lines.flatMap(_.split(" ")).map((_,1))
.groupBy(_._1)
.map(x=>(x._1,x._2.map(_._2).sum))
等价于
scala> lines.flatMap(_.split(" ")).map((_,1))
.groupBy(_._1)
.map(x=>(x._1,x._2.map(_._2)
.reduce(_+_)))
需求点:
1、统计单词中出现的前N个,top N 获取数据,这里的N=10
slice(0,10) : 返回数组中有多少个数
sortBy():从小到大的排序,升序
scala> val a1=List((3,2),(1,0))
scala> a1.sortBy(_._2)
scala> val a = Array((3,4),(5,0))
a: Array[(Int, Int)] = Array((3,4), (5,0))
降序:
scala> a1.sortBy(_._2).reverse <==> a1.sortWith(_._2 > _._2)
_._2 表示按照tuple中第二个元素进行排序
方式一:
scala> lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1)
.map(x=>(x._1,x._2.size))
.toList.sortBy(_._2).reverse.slice(0,10)
方式二:
scala> lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1)
.map(x=>(x._1,x._2.size))
.toList.sortWith(_._2 > _._2).slice(0,10)
方式三:
scala> lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1)
.mapValues(_.size)
.toArray.sortWith(_._2 > _._2).slice(0,10)
2、需求: 过滤掉标点符号, 只获取数字或者字符(去除特殊字符(正则))
python:
import re
p = re.compile(r'\w+')
s = p.findall(s)[0]
scala:
scala> val p = "[0-9]+".r
scala> val s = "avbdd123099"
scala> p.findAllIn(s).toArray
res68: Array[String] = Array(123099)
scala> p.findAllIn(s).foreach(x=>println(x))
scala> p.findAllIn(s).foreach(println(_))
mkString 类似于 concat concat_ws
scala> val p = "[0-9a-zA-Z]+".r
scala> p.findAllIn(s).mkString("[","","]")
scala> lines.flatMap(_.split(" ")).map(x=>(p.findAllIn(x).mkString(""),1))
.groupBy(_._1)
.mapValues(_.size)
.toArray
.sortWith(_._2 > _._2)
.slice(0,5)
需求List:
(1) 统计orders中produce的数量统计
-- 商品被购买的数据量
hive : group by count
spark:
scala> val orders=sql("select * from badou.orders")
scala> val products=sql("select * from badou.products")
scala> val priors=sql("select * from badou.priors")
scala> priors.groupBy("product_id").count()
res6: org.apache.spark.sql.DataFrame = [product_id: string, count: bigint]
方式一:
scala> res6.show(10)
方式二:
scala> priors.groupBy("product_id").count().show(10)
方式三:
scala> val proCnt = priors.groupBy("product_id").count()
proCnt.show(10)
show(): 默认显示20条
show(10): 显示指定的条数
show(1,false) 显示的记录数 和针对字符过长进行格式化显示
方式四:
scala> priors.groupByKey(row=>{row.getString(1)}).count().show(10)
多个分组: groupBy("age","name")
常使用: groupBy
row : 就是一行数据
cache:
scala> val proCnt = priors.groupBy("product_id").count().cache 没有执行,只是加载到内存中
scala> proCnt.show(10) 原计划运行
proCnt.show(10) 直接内存中读取
scala> proCnt.unpersist 内存中直接移除
proCnt.show(10)
(2) 统计produce被 reordered的数量(再次购买)
product_id 进行group by , sum(reordered) 的值
场景:当一个商品被重复购买,重复购买的比率越高(这类商品可以理解为消耗品,抽纸,洗发水等等),那下一次购买的可能性很高
预测:购买这些商品的用户,下一次最容易购买哪些商品
filter: 针对集合中的元素进行过滤, <==> where
scala> orders.filter(col("eval_set")==="test").show(5)
scala> orders.where(col("eval_set")==="test").show(5)
scala> orders.filter(col("eval_set")==="test").filter(col("order_dow")==="1").show(10)
select: 进行列的方式处理
selectExpr: 处理字符串表达式,直接写SQL语句
scala> orders.select("*").show(10)
scala> orders.select(col("order_id"), col("order_number")).show(10)
方式一:
scala> priors.selectExpr("product_id","cast(reordered as int)")
.filter(col("reordered")===1)
.groupBy("product_id").count()
方式二:
priors.selectExpr("product_id","cast(reordered as int)").filter(col("reordered")===1).groupBy("product_id").sum()
方式三:
scala> priors.selectExpr("product_id","cast(reordered as int)")
.groupBy("product_id").sum("reordered")
方式四:
scala> priors.selectExpr("product_id","cast(reordered as int)")
.groupBy("product_id").agg(sum("reordered"))
agg 一般搭配group by 这种聚合函数使用和sum区别,在一次聚合中可以统计多个值,sum, avg ,max,min
priors.selectExpr("product_id","cast(reordered as int)").groupBy("product_id").agg(sum("reordered"),avg("reordered")).show(5)
(3) 结合上面的 统计被重复购买的比率 avg("reordered")
公式: 重复购买的商品量 / 总的商品量 => sum / count
字段重命名 hive as spark
scala> priors.selectExpr("product_id","cast(reordered as int)").groupBy("product_id")
.agg(sum("reordered"),avg("reordered"))
.withColumnRenamed("sum(reordered)","sum_re")
.show(5)
a、重复购买的商品量
val productSumRe = priors.selectExpr("product_id","cast(reordered as int)").groupBy("product_id").agg(sum("reordered"),avg("reordered")).withColumnRenamed("sum(reordered)","sum_re")
b、总的商品量
val proCnt = priors.groupBy("product_id").count()
方式一: scala
priors.selectExpr("product_id","cast(reordered as int)").groupBy("product_id").agg(sum("reordered"),avg("reordered")).show(5)
方式二: SQL
scala> val jCnt = proCnt.join(productSumRe, "product_id")
jCnt.selectExpr("*", "sum_re / count as mean_re").show(5)
方式三: udf
import org.apache.spark.sql.functions._
scala> val avg_udf = udf((sm:Long,cnt:Long)=>sm.toDouble/cnt.toDouble)
scala> jCnt.withColumn("mean_re", avg_udf(col("sum_re"),col("count"))).show(5)
Scala学习笔记总结相关推荐
- Scala 学习笔记
Scala 学习笔记 1 object func_exp { 2 println("Welcome to the Scala worksheet") //> Welcome ...
- Scala学习笔记04:内建控制结构
Scala学习笔记04:内建控制结构 scala提供的控制结构并不算多,因为在函数式编程中,可以自己开发出各种功能的控制结构,所以scala提供的原生控制结构仅仅够用为止. 1.if - 判断 if是 ...
- Scala学习笔记03:操作符
Scala学习笔记03:操作符 一.scala中操作符与方法的等价性 scala中操作符即方法.方法即操作符.scala中操作符其实是普通方法调用的另一种表现形式,运算符的使用其实就是隐含地调用对应的 ...
- Scala学习笔记02:数据类型、常量与变量
Scala学习笔记02:数据类型.常量与变量 一.数据类型 1.基本数据类型 Byte 字节型 Short 短整型 Int 整型 Long 长整型 Char 字符型 String 字符串 Float ...
- Scala学习笔记(三)
Scala学习笔记(三) 一.模式匹配 1. 简单模式匹配 2. 匹配类型 3. 守卫 4. 匹配样例类 5. 匹配数组 6. 匹配列表 7. 匹配元组 8. 变量声明中的模式匹配 8.1 获取数组中 ...
- Scala学习笔记(一)
Scala学习笔记(一) 一.Scala简介 二.Scala安装与配置 1. 安装JDK 2. 安装Scala SDK 3. 安装IDEA插件 三.Scala解释器 1. 启动Scala解释器 2. ...
- 机器学习(三)--- scala学习笔记
Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...
- Scala学习笔记-环境搭建以及简单语法
关于环境的搭建,去官网下载JDK8和Scala的IDE就可以了,Scala的IDE是基于Eclipse的. 下面直接上代码: 这是项目目录: A是scala写的: package first impo ...
- Scala学习笔记-方便查找使用 为Spark学习打基础
Scala学习 注意 伊始 为什么是Scala 网课 环境 电脑环境安装 关于版本的声明 我的环境和版本 IDEA插件安装 IDEA关联Scala源码 基础部分1 文档注释和生成 字符串的三种输出 变 ...
最新文章
- kali用Squid简单配置搭建http代理服务器
- 海思3515,交叉编译opencv2.4.9
- linux shell数组深入学习理解
- 小程序 pc版 缓存路径_WordPress版微信小程序3.5版发布
- php过去文件夹总数,用php获取文件夹内文件的数量
- Bugku-Web-速度要快-WriteUp
- list是否包含字符串_Python创建list
- echrts多条折线
- PDF转图片实现方式
- 【国产mcu填坑篇】------STC(宏晶)
- 0基础前端开发,html5建站教程
- raster包—crop函数
- DustBot机器人
- web前端本科未拿到学位证_您是否需要计算机科学学位才能成为成功的Web开发人员...
- 剑灵万事屋服务器维护,《阴阳师》手游4月22日维护更新公告
- 跳跳虎回家(国庆10.1模拟赛T2)
- can‘t find part type item<$OSR_SYMS>
- My97date日期选择设置最大最小值
- 一个很好的ruby教程
- 解决Gazebo闪退,提示escalating to SIGKILL on server的问题,Melodic更新gazebo9到gazebo11