Apache spark 如何在SparkSql中有效地连接大型表?

Apache spark 如何在SparkSql中有效地连接大型表?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正在尝试使用SparkSql提高涉及两个大型表的联接的性能。从各种来源来看,我认为RDD需要分区 资料来源: 但是,当您直接从下面给出的拼花地板文件加载文件时,我不确定如何将其创建为成对的RDD 对于Spark 2.0.1,使用“cluster by”没有任何效果 val rawDf1 = spark.read.parquet(“file in hdfs”) rawDf1 .createOrReplaceTempView(“rawdf1”) val rawDf2 = spark.read.p

我正在尝试使用SparkSql提高涉及两个大型表的联接的性能。从各种来源来看,我认为RDD需要分区

资料来源:

但是,当您直接从下面给出的拼花地板文件加载文件时,我不确定如何将其创建为成对的RDD

对于Spark 2.0.1,使用“cluster by”没有任何效果

val rawDf1 = spark.read.parquet(“file in hdfs”)
rawDf1 .createOrReplaceTempView(“rawdf1”)

val rawDf2 = spark.read.parquet(“file in hdfs”)
rawDf2 .createOrReplaceTempView(“rawdf2”)

val rawDf3 = spark.read.parquet(“file in hdfs”)
rawDf3 .createOrReplaceTempView(“rawdf3”)

val df1 = spark.sql(“select * from rawdf1 cluster by key)
df1 .createOrReplaceTempView(“df1”)

val df2 = spark.sql(“select * from rawdf2 cluster by key)
df2 .createOrReplaceTempView(“df2”)

val df3 = spark.sql(“select * from rawdf3 cluster by key)
df3 .createOrReplaceTempView(“df3”)

val resultDf = spark.sql(“select * from df1 a inner join df2 b on a.key = b.key inner join df3 c on a.key =c.key”)
无论我是否使用“clusterby”键,我仍然看到Spark生成了相同的查询计划。如何在spark sql中创建rdd对,以便联接可以使用可以分区的表

如果没有适当的分区,就会发生大量的无序操作,导致长时间的延迟

我们的配置(5个工作节点和1个执行器(每个执行器5个内核),每个节点有32个内核和128 GB的RAM):


添加更多信息:我在同一个select中加入多个表,在所有表中使用相同的键。因此,不可能先创建数据帧来调用repartitionby。我知道我可以使用DataFrameAPI来实现这一点。但我的问题是如何使用简单的sparksql实现这一点。

有趣的是,没有给出任何答案,也没有评论
spark.cores.max 25
spark.default.parallelism   75
spark.driver.extraJavaOptions   -XX:+UseG1GC
spark.executor.memory   60G
spark.rdd.compress  True
spark.driver.maxResultSize  4g
spark.driver.memory 8g
spark.executor.cores    5
spark.executor.extraJavaOptions -Djdk.nio.maxCachedBufferSize=262144
spark.memory.storageFraction    0.2