【问题标题】:Spark Group By Key to (Key,List) PairSpark Group By Key to (Key,List) Pair
【发布时间】:2017-03-13 22:53:06
【问题描述】:

我正在尝试按键对一些数据进行分组,其中值将是一个列表:

样本数据:

A 1
A 2
B 1
B 2

预期结果:

(A,(1,2))
(B,(1,2))

我可以使用以下代码做到这一点:

data.groupByKey().mapValues(List(_))

问题是当我尝试执行如下地图操作时:

groupedData.map((k,v) => (k,v(0))) 

它告诉我我的参数数量错误。

如果我尝试:

groupedData.map(s => (s(0),s(1)))

它告诉我“(Any,List(Iterable(Any)) 不带参数”

不知道我做错了什么。我的分组错了吗?有什么更好的方法来做到这一点?

Scala 请只回答。谢谢!!

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    你快到了。只需将List(_) 替换为_.toList

    data.groupByKey.mapValues(_.toList)
    

    【讨论】:

    • 太棒了!那行得通。我真正的问题是,在我拥有密钥列表对之后,我试图用 map 而不是 mapValues 在列表上执行函数。谢谢!
    • 我有点困惑。我认为 groupBy 优于 reduceByKey。但是今天我读到了some articles,表明相反。那么哪一个是真的呢?
    • @Matthias 如果没有上下文,没有好的答案。根据语言、API 和操作,其中任何一个都可能是有效的选择。
    • 是的,很难的话题,但重要的是要理解这一点并尽可能多地阅读它:) 顺便说一句:你能检查this posting。我想你可以回答那个。
    【解决方案2】:

    当你编写表单的匿名内联函数时

    ARGS => OPERATION
    

    将箭头之前的整个部分 (=>) 作为参数列表。所以,在

    的情况下
    (k, v) => ...
    

    解释器把它理解为一个接受两个参数的函数。但是,在您的情况下,您有一个恰好是元组的参数(这里是Tuple2Pair - 更完整地说,您似乎有一个Pair[Any,List[Any]] 的列表)。有几种方法可以解决这个问题。首先,您可以使用表示一对的糖化形式,用一组额外的括号括起来,以表明这是函数的单个预期参数:

    ((x, y)) => ...
    

    或者,您可以将匿名函数编写为匹配元组的部分函数:

    groupedData.map( case (k,v) => (k,v(0)) ) 
    

    最后,你可以简单地使用一个指定的参数,就像你上次的尝试一样,但是 - 意识到它是一个元组 - 引用你需要的元组中的特定字段:

    groupedData.map(s => (s._2(0),s._2(1)))  // The key is s._1, and the value list is s._2   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-28
      • 2012-01-08
      相关资源
      最近更新 更多