【问题标题】:Spark Scala Array of String lines to pairRDDSpark Scala字符串行数组到pairRDD
【发布时间】:2018-08-18 08:35:07
【问题描述】:

如何转换这种数据

"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 中实现。

【问题讨论】:

    标签: scala apache-spark dictionary rdd


    【解决方案1】:

    如果你有一个包含以下数据的文本文件

    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 as 来阅读它

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

    它给你rdd data,然后你可以使用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)
    • @Ramesh Maharjan,非常感谢。很棒,解决了我的问题。你们能否建议一些好的链接来学习 Scala 中的这类东西。
    • 我也在自学,我正在阅读 scala 第 3 版中的编程;)感谢您的接受。不要忘记在您有资格时投票
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2017-04-17
    • 2017-11-03
    • 2018-11-20
    相关资源
    最近更新 更多