问题陈述
在对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不起作用
答案 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))
要删除标题,您可以使用过滤器。我不确定这是不是这个问题。如果是,请发表评论,以便我能纠正。