Action (行动)算子
foreach
foreach 对RDD中的每个元素都应用传入的函数进行操作,
不返回RDD和Array,而是返回Unit
val source:RDD[String] = sc.textFile(".\\datas")
val result_string:RDD[String] = source.map(x=>(x))
// 打印RDD中每个元素
result_string.foreach(println)
count
count 返回整个RDD的元素个数
val con: Long = sc.textFile(".\\datas").flatMap(line => (line.split(" "))).count()
collect
collect 相当于toArray(toArray已经过时不推荐使用),
collect将分布式的RDD返回为一个单机的Scala Array数组,在这个数组上运用Scala的函数式操作。
val col: Array[String] = sc.textFile(".\\datas")
.flatMap(line => line.split(" ")).collect()
for (i <- col) {
println(i)
}
top
top从按降序排列的RDD中获取前几个元素,
比如top(5)表示获取前5个元素。
val col: Array[String] = sc.textFile(".\\datas\\1.txt")
.flatMap(line => line.split(" ")).top(3)
for (i <- col) {
println(i)
}
reduce
reduce 将RDD中的元素两两传递给输入函数,同时产生一个新的值,
新产生的值与RDD中下一个元素再被传递给输入函数,直到最后只有一个值为止。
个人理解:
将第一个命名为x,将第二个命名为y,第三个命名为z,
假设传递的函数为 x+y,
计算过程为 x+y=c,c+z=【reduce的返回值】
val col: String = sc.textFile(".\\datas\\1.txt")
.flatMap(line => line.split(" ")).reduce((x, y) => x + y)
println(col)
saveAsTextFile
saveAsTextFile 将数据输出存储到HDFS的指定目录
sc.textFile(".\\datas\\1.txt").saveAsTextFile(".\\datas\\2.txt")
Transformation(变换/转换)算子
map
返回一个新的 RDD,该 RDD 由每一个输入元素经过 func 函数转换后组成
val source:RDD[String] = sc.textFile(".\\datas")
val result_string:RDD[String] = source.map(x=>(x))
result_string.foreach(println)
val result_map:RDD[(String, Int)] = source.map(x=>(x, 1))
result_string.foreach(println)
sc.stop()
flatMap
类似于 map ,但是每个输入元素可以被映射为 0 或多个输出元素(返回一个序列)
个人理解:执行map之后,将每一个item 再map一次,将结果输出为一列
val arr=sc.parallelize(Array(("A",1),("B",2),("C",3)))
arr.flatmap(x=>(x._1+x._2)).foreach(println)
distinct
distinct将RDD中的元素进行去重操作
sc
// 读取classpath 下 datas\\1.txt
.textFile(".\\datas\\1.txt")
// 将每一个元素 按 " " 空格拆分并且压缩成一列
.flatMap(line => line.split(" "))
// 去重
.distinct().foreach(println)
filter
filter 的功能是对元素进行过滤,对每一个元素应用传入的函数,
返回值为true的元素在RDD中保留;
返回值为false的将过滤掉。
sc
// 读取classpath 下 datas\\1.txt
.textFile(".\\datas\\1.txt")
// 将每一个元素 按 " " 空格拆分并且压缩成一列
.flatMap(line => line.split(" "))
// 去重
.distinct()
// 过滤 留下包含"Hello"的元素
.filter(line => line.contains("Hello"))
.foreach(println)
reduceByKey
reduceByKey就是对元素为 (K,V)的RDD中Key相同元素的Value进行聚合,
因此Key相同的多个元素的值被聚合为一个值,然后与原RDD中的Key组成一个新的(K,V)。
sc
// 读取classpath 下 datas\\1.txt
.textFile(".\\datas\\1.txt")
// 将每一个元素 按 " " 空格拆分并且压缩成一列
.flatMap(line => line.split(" "))
// 每个元素换为(Hello,1),……(Spark,1)
.map(line=> (line, 1))
// reduceByKey会寻找相同key的数据,当找到这样的两条记录时会对其value(分别记为x,y)
// 做(x,y) => x+y的处理,即只保留求和之后的数据作为value。
// 反复执行这个操作直至每个key只留下一条记录。
.reduceByKey((k,v) => k+ v)
.foreach(println)
union
union 可以对两个RDD进行合并,
但并不对两个RDD中的数据进行去重操作,它会保存所有数据;
另外union做合并时要求两个RDD的数据类型必须相同。
// 合并后打印
helloLines.union(checkLines).foreach(println)