![](/img/trans.png)
[英]Apache Spark UDF - Why User Defined Function returning wrong value
[英]Access global variable from UDF (User Defined Function) in python in spark
我正在尝试从 python 中的
pyspark.sql.functions.udf<\/code>函数内部更改全局变量。
但是,没有反映在全局变量中的变化。
可重现的示例以及输出是:
counter = 0
schema2 = StructType([\
StructField("id", IntegerType(), True),
StructField("name", StringType(), True)
])
data2 = [(1, "A"), (2, "B")]
df = spark.createDataFrame(data = data2, schema = schema2)
def myFunc(column):
global counter
counter = counter + 1
return column + 5
myFuncUDF = udf(myFunc, IntegerType())
display(df.withColumn('id1', myFuncUDF(df.id)))
我们可以创建一个自定义的累加器来存储 ID。
class SetAccumulator(AccumulatorParam):
def zero(self, init_value: set()):
return init_value
def addInPlace(self, v1: set, v2: set):
return v1.union(v2)
初始化 set 累加器,并在转换数据帧时从运行我们的 spark 作业的每个线程添加到累加器。 参考 -
#accumulator initialization
acc = spark.sparkContext.accumulator(set(), SetAccumulator())
schema2 = StructType([\
StructField("id", IntegerType(), True),
StructField("name", StringType(), True)
])
data2 = [(1, "A"), (2, "B")]
df = spark.createDataFrame(data = data2, schema = schema2)
#access accumulator as a global variable inside the udf
def myFunc(column):
global acc
int_set = set()
int_set.add(column)
acc += int_set
return column + 5
myFuncUDF = udf(myFunc, IntegerType())
我认为问题是:我们如何将 udf 与全局变量一起使用。 我的问题是我的全局变量是一个数据框。 我无法在 pyspark udf 中使用数据框作为参数。 如果我将数据框声明为全局变量,那么它在应用 udf 时也会显示错误。
如果您知道逻辑和基本的东西,请提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.