首页 > 解决方案 > 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)

标签: pyspark

解决方案


好吧,事实证明,当分区数量增加时,该功能将应用于每个分区

data

这意味着,数据是深度复制的,不会改变。

每次我们使用 F.udf 时,它都会对函数内的每个变量进行深度复制。


推荐阅读