Spark SQL:如何优化多个巨大的Hive表联接

时间:2019-01-22 20:00:53

标签: 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
  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)

在作业中,应该在Hiveitem_id及其他字段上连接4 end_dt表。每个表中大约有1亿条记录。

如何优化联接?例如如果对每个表进行分区,性能可以大大提高吗?谢谢

1 个答案:

答案 0 :(得分:0)

有许多策略可以优化Spark联接。 Spark Summit presentation中概述了许多内容。您可以找到有关优化SortMergeJoin性能here的更多详细信息。

请注意,排序合并联接可以对已排序的数据非常有效地运行。获取正确格式的数据的一种方法是将其保存为存储桶表,并对每个存储桶中的数据进行排序(df.write.bucketBy(n, "x").sortBy("x"))。表元存储区将保留有关存储的信息,稍后查询优化器可以使用该信息。请注意,除非保存到路径,否则这将不起作用,除非您正在使用Databricks Delta之类的东西。

除此之外,您还想看看我对what is an optimized way of joining large tables in Spark SQL的回答。