Apache spark 如何在SparkSql中有效地连接大型表?
我正在尝试使用SparkSql提高涉及两个大型表的联接的性能。从各种来源来看,我认为RDD需要分区 资料来源: 但是,当您直接从下面给出的拼花地板文件加载文件时,我不确定如何将其创建为成对的RDD 对于Spark 2.0.1,使用“cluster by”没有任何效果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
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