我使用的是Spark 2.1.1和Scala 2.11.8。
使用以下代码:
val flattened = avroParsed
.flatMap(x => x.split(":"))
.map(y => ((y),1)).reduceByKey(_+_).saveAsTextFile(outputString)
我得到了输出:
(p162908907,fb_100004769718383,3)
(p182254724,fb_100006973381466,7)
(p162969164,fb_110762469297799,1)
(p182248948,guest_353470061603278_android,8)
我如何修改它以便输出为:
((p162908907,fb_100004769718383),3)
((p182254724,fb_100006973381466),7)
((p162969164,fb_110762469297799),1)
((p182248948,guest_353470061603278_android),8)
不同之处在于,在第一种情况下,输出是三个元素的元组,而在第二种情况下,结果是两个元素的元组,其第一个元素本身是两个元素的元组。
答案 0 :(得分:1)
reduceByKey
的输出为Tuple2[String, Int]
而你需要一个Tuple2[Tuple2[String, String], Int]
,你需要额外的map
分割字符串:
val flattened = avroParsed
.flatMap(x => x.split(":"))
.map(y => ((y), 1))
.reduceByKey(_+_)
.map { case (a, b) => {
val Array(first, second) = a.split(",")
((first, second), b)
}}
.saveAsTextFile(outputString)