我有一个大的spark数据框,它包含各种财务信息,比如说模式看起来像:
Amount
account_id | amount
0 10.00
1 15.15
...
我有另一个大的sparkDataframe,它包含支付信息,应该表示对该金额的支付。例如
Payment
account_id | paid_amount
0 5.00
0 5.00
1 15.15
我想做的是遍历amount数据框中的每个惟一id,一次一个,过滤掉与该id关联的付款,以便执行其他一些计算。
这是一个缓慢的行动还是不明智的?似乎以线性方式循环遍历所有这些帐户ID会丢弃spark提供的许多优化。
如果有的话,还有什么更好的选择呢?
谢谢!
2条答案
按热度按时间nhaq1z211#
下面是解决这个问题的方法。
使两个Dataframe尽可能小(例如,可能运行
payments_df.groupBy("account_id").sum()
,将它们写到磁盘上,看哪一个更小。如果其中一个Dataframe小到可以广播,只需使用
big_df.join(broadcast(small_df), "id", "inner")
. 有关广播连接的更多详细信息,请参见此处。如果可以使用spark 3,请尝试连接,看看自适应查询执行是否能提供所需的性能。
如果这还不够好,可以考虑优化排序合并联接。
绝对不要一个接一个地迭代Dataframe中的行!
yiytaume2#
连接两个Dataframe并对它们执行复杂的操作