TypeError:无效的参数,而不是字符串或列:pyspark UDF

时间:2018-10-15 18:43:41

标签: python pyspark user-defined-functions

我正在一个类中创建一个火花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())

2 个答案:

答案 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