Ошибка типа: неверный аргумент, а не строка или столбец: пользовательские функции pyspark - PullRequest
0 голосов
/ 15 октября 2018

Я создаю искровой 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 голосов
/ 15 октября 2018

Вы всегда должны избегать использования udfs , когда ту же операцию можно выполнить с помощью функций API.

Вот как я бы это сделал:

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")
0 голосов
/ 15 октября 2018

conditions_title, который вы определили в вашем udf, не соответствует;Кажется, вы пытаетесь определить его как статический член класса, но ссылаетесь на него как на метод экземпляра через self, а также, поскольку self в udf здесь не используется, вы можете определить его как статический метод:

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
...