【问题标题】:TypeError using custom Python UDF in Spark 2.1在 Spark 2.1 中使用自定义 Python UDF 的 TypeError
【发布时间】: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


【解决方案1】:

对此UDF的一些反应

  • 如果您使用的包没有安装在节点上,您必须使用 --packages 导入它,但我不确定它是否适用于 C++ 编译包

似乎错误在输出中:

  • word_tokenize 不应返回字符串数组 (ArrayType(StringType())) 而不是字符串。
  • 如果您返回的类型是 pyspark 不支持的类型,它将发出一个错误,指出它不能被腌制(例如返回 numpy ints 会产生类似的错误)

最后:

【讨论】:

  • 嗨,玛丽,感谢您的回复。感谢你的帮助!你是对的,word_tokenize 最终返回一个列表,所以我尝试将其更改为数组类型。不幸的是,我得到了同样的错误,根据我得到的堆栈跟踪,这似乎是由 UDF 引用的函数调用引起的。不幸的是,我也仅限于为这个用例使用自定义库。它确实会导入库并尝试执行 UDF。
猜你喜欢
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
相关资源
最近更新 更多