如何基于少数列解除RDD

时间:2017-03-09 17:31:36

标签: scala apache-spark rdd

嗨我有以下格式的RDD(所有值都是字符串)

rdd1 = [(g1, p1, t1, e1, i1, v1), 
        (g1, p1, t1, e2, i2, v2), 
        (g1, p1, t1, e3, i3, v3), 
        (g1, p1, t1, e4, i4, v4),
        (g2, p2, t2, e3, i3, v3), 
        (g2, p2, t2, e4, i4, v4)...]

我想转换它并获得以下格式

rdd2 = [(g1, p1, t1, "e1.i1.v1|e2.i2.v2|e3.i3.v3|e4.i4.v4"),
        (g2, p2, t2, "e3.i3.v3|e4.i4.v4")...]

所以基于g,p和t值,我想解开RDD,我想让e.i.v值管道在同一行中分开。您可以将g,p和t视为生成元组的关键。

1 个答案:

答案 0 :(得分:1)

它应该非常简单,就像这样:

rdd1
 .map { case (g, p, t, e, i, v) => ((g, p, t), s"$e.$i.$v")}
 .reduceByKey { _ + "|" + _ }
 .map {case ((g, p, t), v) => (g, p, t, v)}