我有一个自定义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工作。
答案 0 :(得分:0)
对此UDF
--packages
导入它,但我不确定它是否适用于C ++编译软件包虽然输出错误似乎是:
word_tokenize
返回字符串数组(ArrayType(StringType())
)而不是字符串。pyspark
不支持的类型,则会发出错误消息,说明它无法被腌制(例如返回numpy整数会产生类似的错误)最后:
tokenize
中有一个单词spark.ml
可能会为您解决问题https://spark.apache.org/docs/2.1.0/ml-features.html#tokenizer