用 Pyspark 编写的自定义 UDF 输出为“java.lang.Object”

阿尔文

我编写了一个自定义转换器类POSWordTagger我的_transform()方法代码是,

def _transform(self, dataset):

    def f(s):
        tokens = nltk.tokenize.wordpunct_tokenize(s)
        pos_tags = nltk.pos_tag(tokens)
        return pos_tags

t = ArrayType(StringType())
out_col = self.getOutputCol()
in_col = dataset[self.getInputCol()]
return dataset.withColumn(out_col, udf(f, t)(in_col))

我按如下方式调用我的变压器类,

sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)

sentenceDataFrame = sqlContext.createDataFrame([
  (0, "Hi I heard about Spark"),
  (0, "I wish Java could use case classes"),
  (1, "Logistic regression models are neat")
  ], ["label", "sentence"])

pos_tagger = POSWordTagger(inputCol="sentence", outputCol="pos")

pos_output=pos_tagger.transform(sentenceDataFrame)
pos_output.select("pos").show()

我得到的输出是,

+--------------------+
|                 pos|
+--------------------+
|[[Ljava.lang.Obje...|
|[[Ljava.lang.Obje...|
|[[Ljava.lang.Obje...|
+--------------------+

即使我将架构作为 传递ArrayType(StringType()),我也将对象引用作为输出。但是如果我只返回tokensas 输出而不是pos_tags从我的_transform()方法中返回,我会正确地获得输出,即令牌列表。谁能让我知道我错过了什么或做错了什么?任何帮助表示赞赏。我的环境是 Spark 1.6 和 Python 2.7。

拉克什·库马尔

看下面的例子,pos_tag返回list(tuple(string))

>>> text = word_tokenize("And now for something completely different")
>>> nltk.pos_tag(text)


[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'),
('completely', 'RB'), ('different', 'JJ')]

所以你的代码中的问题看起来在这里ArrayType(StringType()),所以它应该是ArrayType(ArrayType(StringType()))

###### 回答评论
import pyspark.sql.types as T 
import pyspark.sql.functions as F 
def flattenArray(obj):
    return reduce(lambda x,y:x+y, obj)

pos_output.select(F.udf(flattenArray, T.ArrayType(T.StringType()))("pos").alias("pos")).show(truncate = False)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

pyspark中的熊猫UDF

来自分类Dev

用JSTL编写自定义函数

来自分类Dev

用Java编写自定义异常名称的最佳方法

来自分类Dev

为自定义镜头编写类别实例

来自分类Dev

为我的变量编写自定义设置器-Swift

来自分类Dev

用Erlang编写和编译自定义行为

来自分类Dev

Android中的自定义字体:java.lang.RuntimeException

来自分类Dev

实现一个Java UDF并从pyspark调用它

来自分类Dev

关于用Java编写自定义类异常

来自分类Dev

UDF与自定义表达式

来自分类Dev

为MusicBrainz Picard编写自定义的查找脚本

来自分类Dev

PySpark UDF优化挑战

来自分类Dev

pyspark中的熊猫UDF

来自分类Dev

将udf调用移至新函数后,将azure pyspark udf属性设置为nonetype

来自分类Dev

在PySpark Pandas UDF中指定用户定义功能的正确方法

来自分类Dev

pyspark如何使用两列编写UDF

来自分类Dev

用Java编写自定义异常名称的最佳方法

来自分类Dev

为自定义指令编写自定义事件

来自分类Dev

用Java创建自定义集合

来自分类Dev

用Java编写的Pig UDF中将多个元组作为输入

来自分类Dev

UDF与自定义表达式

来自分类Dev

pyspark提示未定义udf的错误

来自分类Dev

用自定义错误消息替换命令输出

来自分类Dev

Gson 自定义序列化不适用于 java.lang.Object

来自分类Dev

为 SnapLogic 自定义快照设置 JUnit 时出现 java.lang.NoSuchMethodError

来自分类Dev

无法将 java.lang.Object 转换为自定义对象

来自分类Dev

java.lang.NoSuchMethodException: <Class>.<init>(java.lang.String) 复制自定义 Transformer 时

来自分类Dev

pySpark 中的 udf for 循环

来自分类Dev

udf(用户定义函数)如何在 pyspark 中工作?