存在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_id
以及 end_dt
以及其他领域。每个表中大约有100000000条记录。
如何优化连接?e、 g.如果每个表都被分区,性能会有很大的提高吗?谢谢
1条答案
按热度按时间hk8txs481#
有许多优化spark连接的策略。本次spark峰会的报告中概述了许多问题。您可以找到有关优化的更多详细信息
SortMergeJoin
在这里表演。请注意,排序合并联接可以非常有效地处理已排序的数据。获取正确格式的数据的一种方法是将其保存为bucketized表,并对每个bucket中的数据进行排序(
df.write.bucketBy(n, "x").sortBy("x")
). 表元存储将保留有关bucketing的信息,查询优化器稍后可以使用这些信息。请注意,如果保存到路径,这将不起作用,除非使用databricks delta之类的工具。除此之外,您还想看看我对sparksql中连接大型表的优化方法的答案。