【发布时间】:2017-09-20 00:39:56
【问题描述】:
我有一个自定义 Python UDF,我注册它以与 Spark 数据帧一起使用。该函数是从其他库导入的,我将其打包在 Python zip 中,并包含 py 文件。我遇到了一个问题,自定义函数似乎正在解释一个泡菜对象而不是我想要的字符串。示例代码:
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:预期的字符串参数。
当我创建一个自定义函数来返回被解释的类型时,我得到了这个:
def get_type(s):
return type(s)
u'net.razorvine.pickle.objects.ClassDictConstructor@566554e3'
当我执行任何其他类型的简单 UDF 时,它会按预期返回一些简单的东西,例如连接到数据框中每一行的“测试”。
这是什么原因造成的?我的理解正确吗?
谢谢!
一些更新...
我能够让我的 UDF 正常工作。一个挑战是文件编码。 C++ 绑定似乎对此非常挑剔。我的文件被编码为 8859。我仍在努力使用 Unicode,但我能够使 ASCII 工作。
【问题讨论】:
-
它来自哪个包?是treetaggerwrapper吗?
-
对不起,我忘了提。这是一个自定义依赖项,带有用于 python 绑定的编译 C++ 代码。
标签: python pyspark spark-dataframe pickle user-defined-functions