我知道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)
答案 0 :(得分:0)
好吧,事实证明,当分区数增加时,该功能将应用于具有相同分区的每个分区
data
这意味着数据已被深度复制并且不会更改。
每次使用F.udf时,它都会对函数内部的每个变量进行深度复制。