Apache spark 用Pyspark编写的自定义自定义自定义项,输出为;java.lang.Object“;

Apache spark 用Pyspark编写的自定义自定义自定义项,输出为;java.lang.Object“;,apache-spark,pyspark,user-defined-functions,Apache Spark,Pyspark,User Defined Functions,我已经编写了一个定制的transformer类POSWordTagger。我的\u 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())

我已经编写了一个定制的transformer类
POSWordTagger
。我的
\u 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))
我调用我的transformer类如下:

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())
传递,我还是将对象引用作为输出。但是,如果从
\u transform()
方法中仅返回
标记作为输出,而不是
pos\u标记
,那么我得到的输出是正确的,即标记列表。谁能告诉我我错过了什么或做错了什么?感谢您的帮助。我的环境是Spark 1.6和Python 2.7。

看看下面的示例,
pos\u标记
返回
列表(元组(字符串))

所以代码中的问题在这里出现了
ArrayType(StringType())
,所以它应该是
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)

谢谢。上述解决方案有效。但我不是以“[WrappedArray()]”的形式获得输出,我们如何才能获得一个带有标记化单词及其POS标记的列表?我想将其作为功能传递,因此无法使用上述格式的输出。你能告诉我怎样才能得到一个简单的元组列表作为输出而不是WrappedArray吗?看看答案修饰符关于解决方案,我还有一个问题。我需要列表格式的输出作为调用_transform()方法的返回输出。在这里,在转换完成后,UDF在select()方法中工作,该方法以前将输出作为WrappedArray。如何在_transform()方法中使用此UDF?我已经为pos标记使用了一个UDF,那么我应该在哪里使用上面的UDF,以便在调用_transform()时,根据需要以普通列表的形式获得输出?在UDF中,返回语句应该类似于
return reduce(lambda x,y:x+y,pos_标记)
t
应该是
t=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)