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
astrue
所有数据
:
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太大,无法容纳一名工人。