単語のリストを含むDataFrameから、各単語がそれ自身の行にあるDataFrameに変換したいと思います。PySparkで爆発
DataFrameの列でどのように分解するのですか?
ここでは、各コード行のコメントを解除して、次のコメントにエラーが表示された場合の例を示します。 Python 2.7でSpark 1.6.1でPySparkを使用しています。
from pyspark.sql.functions import split, explode
DF = sqlContext.createDataFrame([('cat \n\n elephant rat \n rat cat',)], ['word'])
print 'Dataset:'
DF.show()
print '\n\n Trying to do explode: \n'
DFsplit_explode = (
DF
.select(split(DF['word'], ' '))
# .select(explode(DF['word'])) # AnalysisException: u"cannot resolve 'explode(word)' due to data type mismatch: input to function explode should be array or map type, not StringType;"
# .map(explode) # AttributeError: 'PipelinedRDD' object has no attribute 'show'
# .explode() # AttributeError: 'DataFrame' object has no attribute 'explode'
).show()
# Trying without split
print '\n\n Only explode: \n'
DFsplit_explode = (
DF
.select(explode(DF['word'])) # AnalysisException: u"cannot resolve 'explode(word)' due to data type mismatch: input to function explode should be array or map type, not StringType;"
).show()
追加されていただきありがとうございます。 – user1982118
2つ以上の列を報告する必要がある場合に一般化できるもう少し完全な解決法については、単純な「選択」の代わりに「withColumn」を使用してください: df.withColumn( 'word'、explode( 'word') ).show() これは、爆発を使用した後、DataFrameの残りの列がすべて出力DataFrameにまだ存在することを保証します。これは、選択する必要があるすべての列を指定するよりも簡単です。 df.select( 'col1'、 'col2'、...、 'colN'、explode( 'word')) –