Apache spark spark sql:如何优化多个大型配置单元表连接

Apache spark spark sql:如何优化多个大型配置单元表连接,apache-spark,hive,apache-spark-sql,hiveql,Apache Spark,Hive,Apache Spark Sql,Hiveql,以下是spark sql作业: spark.sql(s"""SELECT * FROM ( select * from default.table1 where created_dt between date '2018-01-01' and '2018-01-02' group by 1,2) table11, -- about 100,000,000 records default.table2 table22,-- about 600,000,000 records

以下是spark sql作业:

spark.sql(s"""SELECT *
  FROM (
  select * from default.table1
  where
  created_dt between date '2018-01-01' and '2018-01-02'
  group by 1,2) table11, -- about 100,000,000 records
  default.table2 table22,-- about 600,000,000 records
  default.table3 table33,-- about 3000,000,000 records
  default.table4 table44-- about 100,000,000 records
  WHERE table22.item_id = table11.item_id
  AND hot.item_site_id  IN (SELECT SITE_ID FROM default.table5)
  AND table22.item_id = table33.item_id
  AND table22.end_dt = table33.end_dt
  AND table22.end_dt >= date '2018-01-01' - interval '180' day
  LIMIT 10000""")
  .collect()
  //.map(t => "Id: " + t(0))
  .foreach(println)
在作业中,4个
Hive
表应在
item\u id
end\u dt
和其他字段上联接。每个表中大约有100000000条记录


如何优化连接?e、 g.如果每个表都进行了分区,性能会有很大提高吗?谢谢

有许多优化Spark连接的策略。这篇文章概括了许多问题。您可以找到有关优化
SortMergeJoin
性能的更多详细信息

请注意,排序合并联接可以非常有效地处理已排序的数据。以正确的形式获取数据的一种方法是将其保存为bucketized表,并对每个bucket中的数据进行排序(
df.write.bucketBy(n,“x”).sortBy(“x”)
)。表元存储将保留有关bucketing的信息,查询优化器稍后可以使用这些信息。请注意,如果保存到路径,这将不起作用,除非您使用的是类似Databricks Delta的东西

除此之外,你还想看看我的答案