SparkRDD操作经验

关于“_”的用法

可以指代集合中的每一个元素

// 筛选出可以被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

你可能感兴趣的:(大数据)