使用另一个表中的列过滤列

时间:2018-03-07 20:34:40

标签: apache-spark pyspark apache-spark-sql spark-dataframe

我有两个数据帧,一个带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|
+------+----------+

我应该使用连接还是过滤器?如果是这样的命令?

1 个答案:

答案 0 :(得分:0)

如果小数据帧可以放入内存,则可以进行广播连接。这意味着小数据帧将被广播到所有执行器节点,并且后续连接可以有效地完成而无需任何随机播放。

您可以提示应使用broadcast广播数据帧:

df2.join(broadcast(df1), "userid", "inner")

请注意,在较大的数据帧上调用join方法。

如果第一个数据帧更小(约100行或更少),filter将是一个可行的,更快的选项。我们的想法是收集数据帧并将其转换为列表,然后使用isin过滤大型数据帧。只要数据足够小,这应该更快。

val userids = df1.as[Int].collect()
df2.filter($"userid".isin(userids:_*))