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

Posted

技术标签:

【中文标题】spark sql:如何优化多个巨大的配置单元表连接【英文标题】:spark sql: how to optimize multiple huge hive tables join 【发布时间】:2019-01-22 20:00:53 【问题描述】:

有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_idend_dt等字段上连接。每个表大约有 100,000,000 条记录。

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

【问题讨论】:

【参考方案1】:

有许多优化 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的回答。

【讨论】:

以上是关于spark sql:如何优化多个巨大的配置单元表连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark SQL 中使用 snappy 压缩将数据写入配置单元表

如何在 spark sql 的配置单元上下文对象中查找已登录/已连接/当前用户?

SQL优化法则小记

Spark - 如何将约 20TB 的数据从 DataFrame 写入配置单元表或 hdfs?

从 spark sql 插入配置单元表

Spark SQL - 无法将所有记录写入配置单元表