关于“_”的用法
可以指代集合中的每一个元素
// 筛选出可以被2整除的数
a.filter(_%2==0).map(2*_)
注:在reduceByKey中指代的是键值对中的值
参考:https://blog.csdn.net/a627082796/article/details/87880558
cache()方法
将某些经过了复杂计算得到的RDD存入缓存中,避免下次调用时重复计算
// 将userInfomation这个RDD保存到缓存中
userInfomation.cache()
sortBy和sortByKey方法
sortBy可以很方便地定义按照那个元素排序
// 按照集合x中的某个元素排序
sortBy(x=>x._2._1,false)
sortByKey是按照键排序,虽然可以重写排序方法但有点麻烦
// false是逆序
sortByKey(false)
scala元组和数组的取值区别
数组:
val arr = Array(1,2,3,4,5,6)
print(x(0))
元组:
val tuple = ("hadoop",3.1415,45,'char')
print(x._1)
Array转换为Hashset
// collect()返回的是Array[T]类型
// 下面整体返回的是HashSet[String]类型
HashSet() ++ targetQQUsers.map(_._1).collect()
广播变量
如果我们要在分布式计算里面分发大对象,例如:字典,集合,黑白名单等,这个都会由Driver端进行分发,一般来讲,如果这个变量不是
广播变量,那么每个task就会分发一份,这在task数目十分多的情况下Driver的带宽会成为系统的瓶颈,而且会大量消耗task服务器上的资源,如果将这个变量声明为广播变量,那么只是每个executor拥有一份,这个executor启动的task会共享这个变量,节省了通信的成本和服务器的资源。
广播变量:实际上就是Executor端用到了driver端的变量
如果在executor端你使用到了driver端的广播变量,如果不使用广播变量,在每个executor中有多少task就有多少变量副本。
注意:
不能将RDD广播出去,RDD不存数据,可以将RDD的结果广播出去,rdd.collect()
广播变量只能在Driver定义,在Executor端不能修改广播变量的值。
- 如何定义一个广播变量
val a = 3
val broadcast = sc.broadcast(a)
- 如何还原一个广播变量
val c = broadcast.value
参考:https://www.cnblogs.com/frankdeng/p/9301653.html