在Spark 2.1中使用自定义Python UDF的TypeError

时间:2017-09-20 00:39:56

标签: python pyspark spark-dataframe pickle user-defined-functions

我有一个自定义Python UDF,我注册用于Spark数据帧。该函数是从其他库导入的,我将其打包成Python zip并包含py文件。我遇到的问题是自定义函数似乎是在解释pickle对象而不是我想要的String。示例代码:

   spark = SparkSession.builder.appName("SparkTest").getOrCreate()
   df = spark.read.text(source_file)
   df.registerTempTable("test")

   testUDF = TaggerWrapper('en').word_tokenize
   tagger_udf  = udf(testUDF, StringType())

   df.withColumn("new_col", tagger_udf("value")).write.csv(path=path, mode='overwrite')

我的执行程序返回错误:TypeError:expected string argument。

当我创建一个自定义函数来返回被解释的类型时,我得到了这个:

def get_type(s):
    return type(s)

u'net.razorvine.pickle.objects.ClassDictConstructor@566554e3'

当我执行任何其他类型的简单UDF时,它按预期工作,返回一些简单的内容,例如“test”连接到数据框中的每一行。

造成这种情况的原因是什么?我的理解是否正确?

谢谢!

一些更新...

我能够让我的UDF正常工作。一个挑战是文件编码。 C ++绑定似乎对此非常挑剔。我的文件编码为8859.我仍在努力使用Unicode,但我能够使ASCII工作。

1 个答案:

答案 0 :(得分:0)

对此UDF

的一些反应
  • 如果您使用的软件包未安装在节点上,则必须使用--packages导入它,但我不确定它是否适用于C ++编译软件包

虽然输出错误似乎是:

  • 不应word_tokenize返回字符串数组(ArrayType(StringType()))而不是字符串。
  • 如果您返回的类型是pyspark不支持的类型,则会发出错误消息,说明它无法被腌制(例如返回numpy整数会产生类似的错误)

最后: