use*_*660 3 reduce scala apache-spark rdd
我的输入数据集看起来像
id1, 10, v1
id2, 9, v2
id2, 34, v3
id1, 6, v4
id1, 12, v5
id2, 2, v6
Run Code Online (Sandbox Code Playgroud)
我想要输出
id1; 6,v4 | 10,v1 | 12,v5
id2; 2,v6 | 9,v2 | 34,v3
Run Code Online (Sandbox Code Playgroud)
就是这样
id1: array[num(i),value(i)] where num(i) should be sorted
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
获取id和第二列作为键,sortByKey但由于它是一个字符串,因此排序不会像int那样发生,而是作为字符串发生
获取第二列作为键,sortByKey然后获取id和键以及第二列值reduceByKey.但在这种情况下,在做的时候
reduceByKey; 订单不会保留.甚至groupByKey没有阻止订单.实际上这是预期的.
任何帮助将不胜感激.
由于您没有提供有关输入类型的任何信息,我认为它是RDD[(String, Int, String)]:
val rdd = sc.parallelize(
("id1", 10, "v1") :: ("id2", 9, "v2") ::
("id2", 34, "v3") :: ("id1", 6, "v4") ::
("id1", 12, "v5") :: ("id2", 2, "v6") :: Nil)
rdd
.map{case (id, x, y) => (id, (x, y))}
.groupByKey
.mapValues(iter => iter.toList.sortBy(_._1))
.sortByKey() // Optional if you want id1 before id2
Run Code Online (Sandbox Code Playgroud)
编辑:
要获得您在注释中描述的输出,您可以使用以下内容替换传递给的函数mapValues:
def process(iter: Iterable[(Int, String)]): String = {
iter.toList
.sortBy(_._1)
.map{case (x, y) => s"$x,$y"}
.mkString("|")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2851 次 |
| 最近记录: |