gpt4 book ai didi

apache-spark - Spark SQL 中联接大表的优化方式是什么

转载 作者:行者123 更新时间:2023-12-03 07:20:15 25 4
gpt4 key购买 nike

我需要使用 Spark SQL 或 Dataframe API 连接表。需要知道实现它的优化方法是什么。

场景是:

  1. 所有数据均以 ORC 格式(基础数据帧和引用文件)存在于 Hive 中。
  2. 我需要将从 Hive 读取的一个基本文件(Dataframe)与 11-13 个其他引用文件结合起来,以创建一个大型内存结构(400 列)(大小约为 1 TB)

实现这一目标的最佳方法是什么?如果有人遇到类似问题,请分享您的经验。

最佳答案

我关于如何优化连接的默认建议是:

  1. 如果可以的话,使用广播连接(参见 this notebook )。从您的问题来看,您的表似乎很大,并且不能选择广播连接。

  2. 考虑使用非常大的集群(它比您想象的更便宜)。现在(2016 年 6 月)花费 250 美元即可在 EC2 现货实例市场上购买约 24 小时的 800 个内核、6Tb RAM 和许多 SSD。在考虑大数据解决方案的总成本时,我发现人们往往大大低估了自己的时间。

  3. 使用相同的分区器。请参阅this question有关联合分组连接的信息。

  4. 如果数据很大和/或您的集群无法增长,甚至上述 (3) 也会导致 OOM,请使用两遍方法。首先,重新分区数据并使用分区表进行持久化 (dataframe.write.partitionBy())。然后,在循环中连续连接子分区,“附加”到同一个最终结果表。

旁注:我在上面说“附加”是因为在生产中我从不使用SaveMode.Append。它不是幂等的,这是一件危险的事情。我在分区表树结构的子树深处使用了SaveMode.Overwrite。在 2.0.0 和 1.6.2 之前,您必须删除 _SUCCESS 或元数据文件,否则动态分区发现将会阻塞。

希望这有帮助。

关于apache-spark - Spark SQL 中联接大表的优化方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37842595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com