Spark - 从逐组输出(RDD)中删除CompactBuffer

时间:2016-05-30 03:14:44

标签: scala hadoop apache-spark

问题陈述

在对RDD进行分组后需要格式化Spark输出(删除CompactBuffer)

输入

Header1^Header2
A^4B
A^11A
B^7A
C^6DF
C^7DS

所需输出

(A,(4B,11A))
(B,(7A))
(C,(6DF,7DS))

我尝试了什么

val records = sc.textFIle("/user/chronicles/test.txt").map(x => {
    val y = x.split("\\^",-1)
    (y(0).trim(),
     y(1).trim())
    }).groupBy(x => x._1)

records.foreach(println)

输出

 (A,CompactBuffer((4B,11A)))
 (B,CompactBuffer((7A)))
 (C,CompactBuffer((6DF,7DS)))

在我的解决方案中,我可以删除" CompactBuffer"通过使用foreach读取每个元素,然后使用replace命令替换单词和额外符号

是否有其他方法可用于格式化数据。

注意: 我跟着:" how to remove compactbuffer in spark output" - 在这种情况下,mkString不起作用

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,请转到:

val data = sc.parallelize(Seq("Header1^Header2", "A^4B", "A^11A", "B^7A", "C^6DF", "C^7DS"))
           .map(x => {
              val y = x.split("\\^", -1)
             (y(0).trim(), y(1).trim())
           }).groupBy(x => x._1).mapValues(_.map(_._2).mkString("(",",",")"))

data.collect.foreach(println)
// (A,(4B,11A))
// (B,(7A))
// (C,(6DF,7DS))
// (Header1,(Header2))

要删除标题,您可以使用过滤器。我不确定这是不是这个问题。如果是,请发表评论,以便我能纠正。