【发布时间】:2020-01-21 17:33:47
【问题描述】:
我在 Spark 中有一个 Dataframe,它注册为一个名为 A 的表,并且有 1 billion 记录和 10 列。第一列 (ID) 是主键。
还有另一个数据框,它注册为一个名为 B 的表,并且有 10,000 记录和 10 列(与表 A 相同的列,第一列 (ID) 是主键)。
表 B 中的记录是“更新记录”。所以我需要用表 B 中的记录更新表 A 中的所有 10,000 条记录。
我首先尝试了这个 SQL 查询:
select * from A where ID not in (select ID from B) 然后将其与表 B 联合。
方法可以,但第一次查询 (select * from A where ID not in (select ID from B)) 非常慢(中等集群上的小时数)。
然后我尝试使用 LEFT JOIN 加速第一个查询:select A.* from A left join B on (A.ID = B.ID ) where B.ID is null
这种方法在逻辑上看起来不错,但对于 Spark 容器来说它需要大量内存
(YARN for exceeding memory limits. 5.6 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memory)..
什么是更好/更快/更少内存消耗的方法?
【问题讨论】:
-
您可以
broadcast将较小的数据框发送给所有工作人员。 -
你能举一个上面的例子吗(或接近上面的例子)?
-
用AutoBroadcast也能做到吗?
conf.set("spark.sql.autoBroadcastJoinThreshold", 1024*1024*200)还是您提出的方法不同? -
(1) - 我建议使用完全连接而不是 + 联合。 (2)加入时尽量广播小表。 (3) 您可以在这里找到Spark SQL Performance Tuning 和Tuning Spark 的一些提示。
-
第二张表的大小是多少?此操作是否需要第二张表的所有列?数据是否基于 id 列均匀分布?数据格式是什么?
标签: sql apache-spark pyspark