Performance 删除另一个数据帧中存在列子集的行的最有效方法

Performance 删除另一个数据帧中存在列子集的行的最有效方法,performance,apache-spark,join,optimization,pyspark,Performance,Apache Spark,Join,Optimization,Pyspark,我正在处理具有以下详细信息的数据: 两个表,live\u表和historical\u表 两个表都有相同的列,a,b,和是活的 live_table是历史_table的一个子集,唯一的区别是在live_table中总是true,在历史_table中总是false 实时表格: a b is_live 1 1 true 2 2 true a b is_live 1 1 false 2 2 false 3 3 fa

我正在处理具有以下详细信息的数据:

  • 两个表,
    live\u表
    historical\u表
  • 两个表都有相同的列,
    a
    b
    ,和
    是活的
  • live_table
    历史_table
    的一个子集,唯一的区别是
    live_table
    中总是
    true
    ,在
    历史_table
    中总是
    false
实时表格

a    b    is_live
1    1    true
2    2    true
a    b    is_live
1    1    false
2    2    false
3    3    false
4    4    false 
5    5    false
历史_表

a    b    is_live
1    1    true
2    2    true
a    b    is_live
1    1    false
2    2    false
3    3    false
4    4    false 
5    5    false
我需要做的是创建一个新表,
all_data
,这是两个表的并集,但要使两个表中的所有数据都具有
is_live
as
true

所有数据

a    b    is_live
1    1    true
2    2    true
3    3    false
4    4    false 
5    5    false
我想到的最好的方法是左反连接,然后是联合:

historical_table = historical_table.join(live_table, on=[a, b], how='leftanti')
all_data = live_table.union(historical_table)
这应该是可行的,但是
historical_table
非常庞大,大约有210亿行,而
live_table
大约有5000万行,因此PySpark在内存相关的问题上一直失败,因为我认为这种连接非常昂贵


有没有其他更有效的方法可以实现这一点?

有没有其他更有效的方法可以实现这一点?
无需加入?可能不会如果行号不是50米,你可能会使用广播。@venky_uuu我不熟悉广播连接。为什么5000万行很重要?P.S.50M是更小的表格。另一个表有21B rowsBroadacasting将表内容复制到每个节点,如果我们复制了大量,它将显示outofmemory错误try tune参数,增加并行性和内存。您的连接方法正确,此处不能使用广播连接,50M太大,无法容纳一名工人。