Spark sql 查询会导致分区计数膨胀


Spark

(1.5.2) 中的分区计数在某些 sql 查询上会爆炸。

这能避免吗?



就我而言,我有三个表(文本、所有者、人员),我对其执行以下查询:

sqlContext.sql(
                "SELECT t.* FROM texts t JOIN ("+
                        "SELECT o.TextId FROM "+
                        "owners o JOIN ("+
                        "SELECT UserId FROM person WHERE LOWER(name) "+
                        "RLIKE '.*"+escapeRegex(filter.name)+"\s*$'"+
                        ") p ON (o.UserId=p.UserId) GROUP BY o.TextId"+
                        ") o "+
                        "ON (t.TextId = o.TextId)")

查询前的分区计数为 2,之后使用 textsDF.javaRDD().partitions().size() 获取的分区计数为 200

加入/分组依据或任何具有随机操作的分区数取决于属性"spark.sql.shuffle.partitions"。在群集配置中,此值必须设置为 200。

此属性的重要性:这决定了对数据的化简器(某种,理解)操作的数量。通过将此属性设置得更高,可以确保存在大量的并行性。

无论如何,您可以根据需要更改该属性。您可以按以下方式设置为SparkConf,使用任何数字。

conf.set("spark.sql.shuffle.partitions","2");

注意:将其设置为较低将降低性能,从而增加网络使用量和降低并行度。

另一方面,文件读取的并行度取决于默认的并行性属性,该属性告诉每个核心的任务数/hdfs 数据中的块数。但是对于任何具有随机操作的操作,它都取决于我提到的属性。

相关内容

  • 没有找到相关文章

最新更新