RDD的groupByKey没有通过

时间:2018-03-28 01:11:22

标签: scala apache-spark tuples rdd

在我的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 case类用于处理连续处理超过22个元组的Scala错误。之前的问题在此解释:number of tuples limit in RDD; reading RDD throws arrayIndexOutOfBoundsException

我想在前5列上做groupBy,我试图将其缩减为密钥列表,然后尝试groupByKey。有人可以帮助我解决我groupByKey的上述方法出了什么问题吗?

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

1 个答案:

答案 0 :(得分:0)

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

使用前5列作为关键字并聚合到第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))
相关问题