【问题标题】:groupByKey of RDD not getting passed throughRDD 的 groupByKey 未通过
【发布时间】:2018-09-06 13:16:36
【问题描述】:

对我的 RDD 上的 groupByKey 有疑问。以下是我正在尝试的查询:

rdd3.map{ case(HandleMaxTuple(col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, col21, col22, col23, col24, col25)) => (HandleMaxTuple(col1,col2,col3, col4, col5),(col6, col7, col8, col9, col10, col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, col21, col22, col23, col24, col25))}.reduceByKey(_+_)
  .map{ case(HandleMaxTuple(col1, col2, col3, col4, col5),(col6, col7, col8, col9, col10, col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, col21, col22, col23, col24, col25))}.groupByKey

我定义的 HandlemaxTuple 案例类用于处理连续处理超过 22 个元组的 Scala 错误。上一个问题在这里解释:number of tuples limit in RDD; reading RDD throws arrayIndexOutOfBoundsException

我想在前 5 列上执行groupBy,我试图将其简化为键列表,然后尝试groupByKey。有人可以帮我解决我上面的groupByKey 方法有什么问题吗?

我的目标是按前 5 列分组,然后聚合得到第 6、7 和 8 列的总和。

【问题讨论】:

  • 这里不是很清楚你想要实现什么。你想做reduceByKey 还是groupByKey?据我了解你的问题,你想一个接一个地做吗? (因为键是相同的 groupByKey 在这种情况下不会做任何事情,数据已经减少了)。
  • @Shaido:嗯,在使用HandleMaxTuple 方法之前,我试图将rdd 与前5 列和第6、第7 和第8 列的总和进行分组,这也是我目前的问题。但是,在介绍了HandleMaxTuple 之后,我使用聚合变得有点困难。在上面的问题中,我尝试将前 5 个转换为键,然后使用 groupBy 但这不起作用。
  • 我明白了,将前 5 列作为键并减少以获得第 6 列、第 7 列和第 8 列的总和应该是可行的,我将在一分钟内添加答案。

标签: scala apache-spark tuples rdd


【解决方案1】:

在进行聚合时,如果您只想要某些列的结果,最好只选择map 中的那些。如果这些小于 Scala 对元组长度的限制 (22),您可以简单地使用元组,否则您需要创建一个新的 case class,其长度与您当前拥有的长度不同。换句话说,除了用作键的前 5 列之外,所有列(或要保留的列)都有一个 case class

使用前 5 列作为 key 并聚合到第 6、7 和 8 列的总和可以如下完成;首先map 选择感兴趣的列,然后进行聚合。

rdd3.map{ case HandleMaxTuple(col1, col2, col3, col4, col5, col6, col7, col8, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _) => 
    ((col1,col2,col3, col4, col5),(col6, col7, col8))
}.reduceByKey((x,y) => (x._1 + y._1, x._2 + y._2, x._3 + y._3))

这将分别给出第 6、7 和 8 列的单独总和。

带有以下行作为输入的 RDD 的小示例:

HandleMaxTuple(1,2,3,4,5,6,7,8,9,10,11,12)
HandleMaxTuple(13,2,3,4,5,6,7,8,9,10,11,12)
HandleMaxTuple(1,2,3,4,5,65,7,8,9,10,11,12)

给予:

((13,2,3,4,5),(6,7,8))
((1,2,3,4,5),(71,14,16))

【讨论】:

  • 它适用于元组<=22;再次讽刺。即使我已经指定HandleMaxTuple 来处理22 的这个限制,在reduceByKey 中,我也必须指定剩余的列,不要在生成的rdd 中排除它们。这又给了我<console>:1: error: too many elements for tuple: 25, allowed: 22 但你的回答解释了我在方法中缺少的东西。
  • @knowone 是的,我想你可以创建另一个少 5 列的案例类,并使用它来代替 (col6, col7, col8) 元组。不过,我可能会建议使用没有此约束的数据框(我知道您之前说过使用 RDD 是一项要求,所以我没有将其包含在答案中)。
  • 感谢 Shaido。有了 DF,我已经做到了。我只是在尝试与 RDD 相同的功能,希望在处理速度方面进行一些优化。
猜你喜欢
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多