我有一个Spark作业,使用以下组按查询。我知道分组是邪恶的,但在我的用例中我无法避免它。我尝试使用DataFrame
和hiveContext.sql()
,但两者都洗牌巨大的数据,是非常缓慢的:一个查询需要大约5分钟。我曾见过一个组分阶段进行20 GB的随机读取和10 GB的随机写入。我有大约8个字段作为分组通过字段
sourceFrame.select("blabla").groupby("col1","col2","col3",..."col8").agg("bla bla");
或
hiveContext.sql("insert into table partitions bla bla group by "col1","col2","col3",..."col8"");
我已经尝试了几乎所有的调谐参数,如钨,lz4,更多的spark.shuffle.memoryFraction
约0.6。大多数情况下,Spark UI中按阶段分组等待shuffle读取并在那里挂起甚至几个小时。我用的是Spark 1.4.0
reduceByKey是groupBy的替代选项,但您需要从数据帧转换为RDD。我有类似的问题,但我解决了使用df。然后使用reduceByKey