Que*_*atl 12 apache-spark pyspark spark-dataframe
在给定的值列表中过滤pyspark中的数据帧的一般最佳实践是什么?特别:
根据给定值列表的大小,那么关于运行时何时最好使用isinvs inner joinvs
broadcast?
这个问题是Pig中以下问题的火花类比:
附加背景:
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).在上下文问题中,过滤是使用另一个数据帧的列完成的,因此可以使用连接的解决方案.
请记住,如果你的过滤列表是通过它搜索将需要一段时间的比较大的动作,因为它做的每一行来完成它可以迅速得到昂贵.
另一方面,连接涉及两个将在匹配之前进行排序的数据帧,因此如果您的列表足够小,您可能不希望仅针对过滤器对大型数据帧进行排序.
join 和 isin 都适用于我所有的日常工作案例。
注意 - 如果您有一个大型数据集(例如约 500 GB)并且您想要进行过滤,然后处理过滤后的数据集,那么
使用 isin 的数据读取/处理速度明显非常低且快速。整个 500 GB 将不会被加载,因为您已经从 .isin 方法中过滤了较小的数据集。
但对于 Join 情况,将加载和处理整个 500GB。因此处理时间会长得多。
我的情况,使用过滤后
isin,然后处理并转换为 Pandas DF。花费了 < 60 秒
使用 JOIN 然后处理并转换为 Pandas DF。需要 > 1 小时。
| 归档时间: |
|
| 查看次数: |
3055 次 |
| 最近记录: |