我有两个数据帧,一个带ID的小数据帧和一个大数据帧(带有id和trx_id的60亿行)。我希望大表中的所有事务都具有与小客户ID相同的客户ID。例如:
DF1:
+------+
|userid|
+------+
| 348|
| 567|
| 595|
+------+
DF2:
+------+----------+
|userid| trx_id |
+------+----------+
| 348| 287|
| 595| 288|
| 348| 311|
| 276| 094|
| 595| 288|
| 148| 512|
| 122| 514|
| 595| 679|
| 567| 870|
| 595| 889|
+------+----------+
我想要的结果:
+------+----------+
|userid| trx_id |
+------+----------+
| 348| 287|
| 595| 288|
| 348| 311|
| 595| 288|
| 595| 679|
| 567| 870|
| 595| 889|
+------+----------+
我应该使用连接还是过滤器?如果是这样的命令?
答案 0 :(得分:0)
如果小数据帧可以放入内存,则可以进行广播连接。这意味着小数据帧将被广播到所有执行器节点,并且后续连接可以有效地完成而无需任何随机播放。
您可以提示应使用broadcast
广播数据帧:
df2.join(broadcast(df1), "userid", "inner")
请注意,在较大的数据帧上调用join
方法。
如果第一个数据帧更小(约100行或更少),filter
将是一个可行的,更快的选项。我们的想法是收集数据帧并将其转换为列表,然后使用isin
过滤大型数据帧。只要数据足够小,这应该更快。
val userids = df1.as[Int].collect()
df2.filter($"userid".isin(userids:_*))