如何重新格式化地图功能输出?

时间:2017-07-10 06:13:38

标签: scala apache-spark

我使用的是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)

不同之处在于,在第一种情况下,输出是三个元素的元组,而在第二种情况下,结果是两个元素的元组,其第一个元素本身是两个元素的元组。

1 个答案:

答案 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)