在我的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列的总和。
答案 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))