(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 数据中的块数。但是对于任何具有随机操作的操作,它都取决于我提到的属性。