我正在一个类中创建一个火花UDF。当我执行以下代码时,我得到了异常。
class A(B):
def __init__(self,spark):
B.__init__(self)
self.spark = spark
def process(self, df):
df = df.withColumn("col_sub_entry", self.conditions_title("entry_title"))
def conditions_entry_title(self,x:StringType()):
if len(x.split(" ") < 3):
return 0
else :
return x
conditions_title = udf(conditions_entry_title, IntegerType())
答案 0 :(得分:2)
使用API函数可以执行相同的操作时,您应该始终avoid using udfs。
这就是我要做的:
from pyspark.sql.functions import when, col, size, split
class A:
def __init__(self, spark):
# B.__init__(self)
self.spark = spark
def process(self, df):
df = df.withColumn("col_sub_entry", A.conditions_title("entry_title"))
return df
@staticmethod
def conditions_title(someColumn):
return when(size(split(col(someColumn), "\s")) < 3, 0).otherwise(1)
甚至:
@staticmethod
def conditions_title(someColumn):
return (size(split(col(someColumn), "\s")) >= 3).cast("int")
答案 1 :(得分:1)
您在udf中定义的conditions_title
不一致;似乎您试图将其定义为类的静态成员,但通过self
将其引用为实例方法,并且由于此处未使用udf中的self
,因此可以对其进行定义作为静态方法:
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType, StringType
class A:
def __init__(self, spark):
# B.__init__(self)
self.spark = spark
def process(self, df):
df = df.withColumn("col_sub_entry", A.conditions_title("entry_title"))
return df
@staticmethod
@udf(IntegerType())
def conditions_title(x: StringType):
if len(x.split(" ")) < 3:
return 0
else :
return 1