在Spark 2.1中使用自定义Python UDF时出现类型错误

2024-10-03 13:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个定制的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工作。


Tags: 文件数据path函数字符串test类型编码
1条回答
网友
1楼 · 发布于 2024-10-03 13:23:10

对此的一些反应UDF

  • 如果您使用的包没有安装在节点上,必须使用^ {CD2}}导入它,但我不确定它是否与C++编译包
  • 一起工作

但是,错误似乎出在输出上:

  • word_tokenize不应该返回字符串数组(ArrayType(StringType()))而不是字符串。在
  • 如果返回的类型是pyspark不支持的类型,它将发出一个错误,说明它不能被pickle(例如,返回numpy int会产生类似的错误)

最后:

相关问题 更多 >