在 UDF 中使用函数字典

use dict of function in UDF

在 pySpark 中,我有一个数据框 df 如下:

Site    A   B
1       3   83
1       16  26
1       98  46
1       80  14
1       83  54
2       0   83
2       75  67
2       72  24
2       60  13
6       40  50
6       34  60
6       36  39
6       68  6
6       91  51
6       81  82

或者另一方面,我有一个字典 myDict 函数 g = {1 : f1, 2 : f2, 3: f3, 6:f6}

我想用字典生成一个新的列。就像是 : df.withColumn("MyCol", myDict[df.Site](df.A, df.B))

但是当我这样做时,我收到错误消息:

unhashable type: 'Column'

Traceback (most recent call last):

TypeError: unhashable type: 'Column'

应该怎么写?

您想使用 Currying

withColumn 函数仅接受同一数据框中的现有列作为参数或通过 lit() 函数的文字(lit 实际上是 returns 列)。

为了传递额外的参数,你必须使用一个 higher-order function 那 returns 一个 udf:

class MyUDFs():
    @staticmethod
    def trans(myDict):
        def cb(Site,A,B):
            return myDict[Site](A, B)
        return udf(cb, StringType())

df = df.withColumn("MyCol",MyUDFs.trans(myDict)(df["Site"],df["A"],df["B"]))