pyspark:isin vs join

Que*_*atl 12 apache-spark pyspark spark-dataframe

在给定的值列表中过滤pyspark中的数据帧的一般最佳实践是什么?特别:

根据给定值列表的大小,那么关于运行时何时最好使用isinvs inner joinvs broadcast

这个问题是Pig中以下问题的火花类比:

Pig:按加载列表进行高效过滤

附加背景:

Pyspark功能齐全

MaF*_*aFF 14

考虑到

import pyspark.sql.functions as psf
Run Code Online (Sandbox Code Playgroud)

广播有两种类型:

  • sc.broadcast() 将python对象复制到每个节点以便更有效地使用 psf.isin
  • psf.broadcast在a中join,当数据帧很小时,将你的pyspark数据帧复制到每个节点:df1.join(psf.broadcast(df2)).它通常用于笛卡儿产品(猪的CROSS JOIN).

在上下文问题中,过滤是使用另一个数据帧的列完成的,因此可以使用连接的解决方案.

请记住,如果你的过滤列表是通过它搜索将需要一段时间的比较大的动作,因为它做的每一行来完成它可以迅速得到昂贵.

另一方面,连接涉及两个将在匹配之前进行排序的数据帧,因此如果您的列表足够小,您可能不希望仅针对过滤器对大型数据帧进行排序.

  • 这就是我的意思:`isin`如果过滤列表很小,`join`如果很大。广播允许您使自己的“ isin”或“ join”(无论您选择了哪个)表现得更好 (5认同)
  • 目前还不清楚“小”、“大”是什么意思 (5认同)
  • 我得到了两种不同类型的广播,但是我不确定我对原始问题的答案是否很清楚,该问题涉及通过给定的value_list有效地_过滤pyspark中的数据帧。我可以通过说值列表_是否为“ small”来简化此操作,使用`isin`,而值列表是否为“ big”来使用内部联接以及DataFrame中的值吗? (2认同)

Man*_*ahu 5

join 和 isin 都适用于我所有的日常工作案例。

  1. isin 对于小型和小型(~1M)列表集都适用。

注意 - 如果您有一个大型数据集(例如约 500 GB)并且您想要进行过滤,然后处理过滤后的数据集,那么

  1. 使用 isin 的数据读取/处理速度明显非常低且快速。整个 500 GB 将不会被加载,因为您已经从 .isin 方法中过滤了较小的数据集。

  2. 但对于 Join 情况,将加载和处理整个 500GB。因此处理时间会长得多。

我的情况,使用过滤后

  1. isin,然后处理并转换为 Pandas DF。花费了 < 60 秒

  2. 使用 JOIN 然后处理并转换为 Pandas DF。需要 > 1 小时。