pyspark - dataframe 使用 udf 有分区引起的问题
问题描述
我知道 pyspark 中的数据框有它们的分区,当我在一列上应用函数(udf)时,不同的分区将并行应用相同的函数。
df = sqlCtx.createDataFrame(
[
(1, 1, 'A', '2017-01-01'),
(2, 3, 'B', '2017-01-02'),
(3, 5, 'A', '2017-01-03'),
(4, 7, 'B', '2017-01-04')
],
('index', 'X', 'label', 'date')
)
data=df.rdd.map(lambda x:x['label']).collect()
def ad(x):
return data.pop(0).lower()
AD=F.udf(ad,StringType())
df.withColumn('station',AD('label')).select('station').rdd.flatMap(lambda x:x).collect()
这是输出:
['a', 'a', 'a', 'a']
应该是:
['a', 'b', 'a', 'b']
而最奇怪的是
data
我们调用函数后甚至没有改变
data.pop(0)
解决方案
好吧,事实证明,当分区数量增加时,该功能将应用于每个分区
data
这意味着,数据是深度复制的,不会改变。
每次我们使用 F.udf 时,它都会对函数内的每个变量进行深度复制。
推荐阅读
- node.js - 使用 Node-IMAP 搜索主题中具有特定字符串的电子邮件
- python - 在我的简单 Python 套接字服务器上实现 HTTP 和 HTTPS
- python-3.x - 以不同格式显示输出的抓取元素列表
- pandas - 如何查看数据框输出
- r - 通过重复值和何时有断点创建具有条件的新列
- python-3.x - Pandas 带有 Group By 的多重条件均值
- android - 无法通过 Gson 从 sharedpreference 中检索对象
- batch-file - 查找注册表项并仅在存在时保存值
- c# - Automapper 没有将字典映射到对象
- facebook - 如何通过链接将视频直接分享到 facebook/instagram 作为可以使用 react-native 直接播放的视频