我有一个定制的Python UDF,我注册它以用于Spark数据帧。这个函数是从其他库导入的,我将它打包到pythonzip中,包括py文件。我遇到了一个问题,自定义函数似乎在解释pickle对象,而不是我希望它解释的字符串。示例代码:
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:需要字符串参数。
当我创建一个自定义函数来返回要解释的类型时,我得到了:
^{pr2}$u'net.razorvine.pickle网站.objects.ClassDictConstructor@566554e3'
当我做任何其他类型的简单UDF时,它按预期工作,返回一些简单的东西,如“test”连接到数据帧中的每一行。
是什么造成的?我的理解正确吗?
谢谢!
一些更新。。。
我能让我的UDF工作。一个挑战是文件编码。C++绑定看起来很挑剔。我的文件编码为8859。我仍然在努力使用Unicode,但我能够让ASCII工作。
对此的一些反应
UDF
但是,错误似乎出在输出上:
word_tokenize
不应该返回字符串数组(ArrayType(StringType())
)而不是字符串。在pyspark
不支持的类型,它将发出一个错误,说明它不能被pickle(例如,返回numpy int会产生类似的错误)最后:
spark.ml
中有一个单词tokenize
函数,它可能会帮你https://spark.apache.org/docs/2.1.0/ml-features.html#tokenizer相关问题 更多 >
编程相关推荐