繁体   English   中英

"从spark中python中的UDF(用户定义函数)访问全局变量"

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM