Apache spark 如何在Spark DataFrame中按查询优化分组?

Apache spark 如何在Spark DataFrame中按查询优化分组?,apache-spark,hive,apache-spark-sql,Apache Spark,Hive,Apache Spark Sql,我有一个Spark作业,它使用以下分组查询。我知道groupby是邪恶的,但在我的用例中我无法避免它。我尝试使用DataFrame和hiveContext.sql()来使用它,但两者都会洗牌大量数据,而且速度非常慢:一个查询大约需要5分钟。我见过一组人分阶段进行20GB的随机读取和10GB的随机写入。我有大约8个字段作为分组字段传入 sourceFrame.select("blabla").groupby("col1","col2","col3",..."col8").agg("bla bla"

我有一个Spark作业,它使用以下分组查询。我知道groupby是邪恶的,但在我的用例中我无法避免它。我尝试使用
DataFrame
hiveContext.sql()
来使用它,但两者都会洗牌大量数据,而且速度非常慢:一个查询大约需要5分钟。我见过一组人分阶段进行20GB的随机读取和10GB的随机写入。我有大约8个字段作为分组字段传入

sourceFrame.select("blabla").groupby("col1","col2","col3",..."col8").agg("bla bla"); 


我已经尝试了几乎所有的调优参数,比如wown、lz4、more
spark.shuffle.memoryFraction
0.6左右。在Spark UI中,大多数时间按阶段分组等待随机读取,并在那里等待甚至数小时。我使用的是Spark 1.4.0。

reduceByKey是groupBy的替代选项,但您需要将数据帧转换为RDD。我也有类似的问题,但我用df.rdd解决了,然后用reduceByKey

你试过reduceByKey吗?你试过设置
spark.sql.shuffle.partitions
更高吗?它的默认值是200,但是有更多的分区应该有助于一次移动更少的数据。我们不能像我提到的那样在多个键上使用reduceBykey。我有8个键,我可以按它们分组
hiveContext.sql("insert into table partitions bla bla group by "col1","col2","col3",..."col8"");