flatMap 算子在word count中经常使用,是一个transformation 算子
1、如果使用map
val arr=sc.parallelize(Array(("A",1),("B",2),("C",3))) arr.map(x=>(x._1+x._2)).collect.foreach(println)
输出结果:
A1
B2
C3
如果使用flatMap(打平作用的对象是一个字符串)
val arr=sc.parallelize(Array(("A",1),("B",2),("C",3))) arr.flatMap(x=>(x._1+x._2)).collect.foreach(println)
输出结果
A 1 B 2 C 3
2、flatMap使用2: (flat的作用对象是一个list)
val data2=sc.parallelize(List(List("A1 A2"),List("B2 B3"))) data2.map(x=>x).collect.foreach(println(_))
结果
List(A1 A2)
List(B2 B3)
flatMap
val data2=sc.parallelize(List(List("A1 A2"),List("B2 B3"))) data2.flatMap(x=>x).collect.foreach(println(_))
实际案例
字符串中如何统计相邻字符对出现的次数。意思就是如果有A;B;C;D;B;C字符串,则(A,B),(C,D),(D,B)相邻字符对出现一次,(B,C)出现两次。
数据如下:
A;B;C;D;B;D;C
B;D;A;E;D;C
A;B
代码
data.map(x=>x.split(";")).flatMap(x=>{ for(i<- 0.until(x.length-1)) yield (x(i)+","+x(i+1),1) }).reduceByKey(_+_).collect().foreach(println(_))
结果:
(A,E,1) (E,D,1) (D,A,1) (C,D,1) (B,C,1) (B,D,2) (D,C,2) (D,B,1) (A,B,2)