【问题标题】:format a (K, (v, w)) pair in spark rdd在 spark rdd 中格式化 (K, (v, w)) 对
【发布时间】:2015-08-21 00:25:49
【问题描述】:

我有一个这样的rdd:

val custFile = sc.textFile("custInfo.txt").map(line => line.split('|'))

val custPrd = custFile.map(a => (a(0), ((a(1)), (a(2), a(3), a(4), a(5), a(6), a(7), a(8)))))

val custGrp = custPrd.groupByKey

custGrp.saveAsTextFile("custinfo2")

产生这个:

(1104,CompactBuffer((S_SAVG,(1,1,1,1,1,1,1)), (CN_SAVG,(4,4,1,1,4,1,1))))

我怎样才能使用这样的东西:

custPrdGrp.map{case (k, vals) => {val valsString = vals.mkString(", "); s"{$k:, {$valsString}}" }}

格式化 (k, (v, w)) 对...我试过了,但出错了:

val custPrdRep = custPrdGrp.map({case (k, (v, w)) => {val valsString = v.mkString(", "); val valsPrvcy = w.mkString(", "); s"'${k}'| [$valsString]" }})
<console>:27: error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: Iterable[(String, (String, String, String, String, String, String, String))]
       val custPrdRep = custPrdGrp.map({case (k, (v, w)) => {val valsString = v.mkString(", "); val valsPrvcy = w.mkString(", "); s"'${k}'| [$valsString]" }})
                                                 ^ 


<console>:27: error: not found: value v
           val custPrdRep = custPrdGrp.map({case (k, (v, w)) => {val valsString = v.mkString(", "); val valsPrvcy = w.mkString(", "); s"'${k}'| [$valsString]" }})
                                                                                  ^
    <console>:27: error: not found: value w
           val custPrdRep = custPrdGrp.map({case (k, (v, w)) => {val valsString = v.mkString(", "); val valsPrvcy = w.mkString(", "); s"'${k}'| [$valsString]" }})

我希望数组看起来像这样:

('1104'|{'S_SAVG': {a: '1', b: '1', c: '1', d: '1', e: '1', f: '1', g: '1'}, 'CN_SAVG': {a: '4', b: '4', c: '1', d: '1', e: '4', f: '1', g: '1'}})

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    嗯,这里有很多细节,但这样的东西应该可以工作:

    val keys = List("a", "b", "c", "d", "e", "f", "g")
    
    custGrp.map{case (k, vals) => {
        val valsString = vals map {
            case (val1, val2) => {
                val pairs = keys
                    // Create someLetter: 'someNumber' pairs
                    .zip(val2.productIterator.map{case (x: String)  => x}.toSeq)
                    .map{case (k, v) => s"$k: '$v'"}
                    // Join into a single string
                    .mkString(", ")
                // Add "key"
                s"'$val1': {$pairs}"
            }
        }
        // Combine above
        val valsComb = valsString.mkString(", ")
        // Create final string
        s"('$k'|{$valsComb})"
    }}
    

    您可以通过首先创建正确的数据结构来简化事情。例如,使用 Maps 而不是元组:

     Map("S_SAVG" -> Map("a" -> "1", "b" -> "1", ...), ...)
    

    【讨论】:

    • 你能帮我理解一些事情吗...我是 scala 和 spark 的新手,所以想了解更多...例如...map{case (k, vals) =&gt; 是做什么的?它映射到什么?另外,.zip(val2.productIterator.map{case (x: String) =&gt; x}.toSeq) 在做什么?和.mkString。对不起,如果问题是基本的,但我真的很想理解这个......
    • 哇哦。 1. map{case (k, vals) => 究竟是做什么的? _它是一个模式匹配匿名函数。请参阅:stackoverflow.com/a/30879186/1560062(我不介意在那里投赞成票:D)2. _what is .zip(val2.productIterator ... doing 好吧,要了解您必须深入了解Product Classes . 这里它被用作一种非常幼稚的方式 将元组转换为集合, 3. 和.mkString 它只是在输入集合的每个元素上调用toString 和使用提供的分隔符连接结果。
    • 另外,你能帮我理解这部分以及它的去向吗? Map("S_SAVG" -&gt; Map("a" -&gt; "1", "b" -&gt; "1", ...), ...)
    • 你可以像这样映射val custPrd = custFile.map(a =&gt; (a(0), ((a(1)), Map("a" -&gt; a(2), "b" -&gt; a(3), ..., "g" -&gt; a(8))))) 并调整下游代码。然后你可以省略productIterator 并且名字已经就位了。
    • 另外,我尝试了你上面的答案,但由于某种原因得到了相同的数组结果......以及通过示例学习这些东西的最佳地点是什么......我找到了非常基本的教程但找不到更复杂的...
    猜你喜欢
    • 2018-11-23
    • 2015-06-28
    • 2015-07-07
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多