2017-03-29 3 views
1

POSWordTagger 사용자 지정 변환기 클래스를 작성했습니다. , 방법 코드는 내가 스키마를 통과하고 있지만 다음과 같이 내 변압기 클래스를 호출하고"java.lang.Object"로 출력하는 Pyspark로 작성된 사용자 정의 UDF

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())으로, 나는 ouput으로 Object 참조를 얻고있다. 그러나 "_transform()"메서드에서 "pos_tags"대신 "tokens"만 출력으로 반환하면 올바르게 출력됩니다. 즉, 토큰 목록입니다. 아무도 제가 누락되었거나 잘못하고 있다는 것을 알려주시겠습니까? 어떤 도움을 주셔서 감사합니다. 내 환경은 Spark 1.6 및 Python 2.7입니다. 아래의 예에서

답변

0

봐, 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()) 보이는, 그래서 댓글

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) 
를 들어 ArrayType(ArrayType(StringType()))

###### 응답해야한다
+0

고마워요. 위의 솔루션이 작동합니다. 하지만 결과를 "[WrappedArray()]로 가져 오지 못했습니다. 어떻게 토큰 화 된 단어와 POS 태그가있는 목록을 얻을 수 있습니까? 기능으로 전달하고 싶기 때문에 출력을 위 형식으로 사용할 수 없습니다. WrappedArray가 아닌 출력으로 튜플의 일반 목록을 어떻게 얻을 수 있습니까? – Alvin

+0

답을 봐 수정 된 –

+0

솔루션에 관해서는, 나는 한 가지 더 관심이 있습니다. _transform() 메서드 호출의 반환 출력으로 목록 형식의 출력이 필요합니다. 여기서 UDF는 이전에 WrappedArray로 출력을 제공 한 변형이 이미 완료된 후 select() 메서드에서 작동합니다. _transform() 메서드 내에서이 UDF를 어떻게 사용할 수 있습니까? 나는 이미 pos 태그에 대해 UDF를 사용하고 있으므로 _transform()에 대한 호출이 완료되면 원하는대로 일반 목록으로 출력되도록 위의 UDF를 어디에 사용해야합니까? – Alvin

관련 문제