Spark Scala 字符串数组转换为 pairRDD

3
如何转换这种类型的数据
"Row-Key-001, K1, 10, A2, 20, K3, 30, B4, 42, K5, 19, C20, 20"
"Row-Key-002, X1, 20, Y6, 10, Z15, 35, X16, 42"
"Row-Key-003, L4, 30, M10, 5, N12, 38, O14, 41, P13, 8"

使用Scala将其转换为Spark RDD,以便我们可以获得:
Row-Key-001, K1
Row-Key-001, A2
Row-Key-001, K3
Row-Key-001, B4
Row-Key-001, K5
Row-Key-001, C20
Row-Key-002, X1
Row-Key-002, Y6
Row-Key-002, Z15
Row-Key-002, X16
Row-Key-003, L4
Row-Key-003, M10
Row-Key-003, N12
Row-Key-003, O14
Row-Key-003, P13

我认为我们可以将输入拆分为一系列行,并再次在每行上使用“,”进行拆分,然后将其添加到一个Map中,例如每行的第一个元素作为键,每个交替元素作为值。
但需要帮助在Scala中实现此操作。
1个回答

7
如果您有一个包含以下数据的文本文件
Row-Key-001, K1, 10, A2, 20, K3, 30, B4, 42, K5, 19, C20, 20
Row-Key-002, X1, 20, Y6, 10, Z15, 35, X16, 42
Row-Key-003, L4, 30, M10, 5, N12, 38, O14, 41, P13, 8

然后,您可以使用sparkContext的textFile API来读取它,如下:

val rdd = sc.textFile("path to the text file")

这将为您提供rdd数据,然后您可以使用mapflatMap进行以下解析。

rdd.map(_.split(", "))
  .flatMap(x =>  x.tail.grouped(2).map(y => (x.head, y.head)))

你应该得到以下结果:
(Row-Key-001,K1)
(Row-Key-001,A2)
(Row-Key-001,K3)
(Row-Key-001,B4)
(Row-Key-001,K5)
(Row-Key-001,C20)
(Row-Key-002,X1)
(Row-Key-002,Y6)
(Row-Key-002,Z15)
(Row-Key-002,X16)
(Row-Key-003,L4)
(Row-Key-003,M10)
(Row-Key-003,N12)
(Row-Key-003,O14)
(Row-Key-003,P13)

我希望这个答案有所帮助。


不错,你让我发现了.grouped(n) - Xavier Guihot
@Ramesh Maharjan,非常感谢。这很棒,解决了我的问题。你们能否推荐一些学习Scala这类东西的好链接? - Deepak Sharma
1
我也在自学,并且正在阅读《Scala编程(第三版)》;) 感谢您的接受。当您有资格时,请不要忘记点赞。 - Ramesh Maharjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接