web-dev-qa-db-ja.com

PySparkで爆発する

単語のリストを含むDataFrameから、各単語が独自の行にあるDataFrameに変換したいと思います。

DataFrameの列を爆発させるにはどうすればよいですか?

これは、各コード行のコメントを解除して、次のコメントにリストされているエラーを取得できる私の試みのいくつかの例です。私はPySparkをPython 2.7 with Spark 1.6.1。

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()

ご意見をお聞かせください

22
user1982118

explodesplitはSQL関数です。どちらもSQL Columnで動作します。 splitは、2番目の引数としてJava正規表現を取ります。任意の空白でデータを分離する場合は、次のようなものが必要です。

df = sqlContext.createDataFrame(
    [('cat \n\n elephant rat \n rat cat', )], ['Word']
)

df.select(explode(split(col("Word"), "\s+")).alias("Word")).show()

## +--------+
## |    Word|
## +--------+
## |     cat|
## |elephant|
## |     rat|
## |     rat|
## |     cat|
## +--------+
32
zero323

空白で分割し、空白行も削除するには、where句を追加します。

DF = sqlContext.createDataFrame([('cat \n\n elephant rat \n rat cat\nmat\n', )], ['Word'])

>>> (DF.select(explode(split(DF.Word, "\s")).alias("Word"))
       .where('Word != ""')
       .show())

+--------+
|    Word|
+--------+
|     cat|
|elephant|
|     rat|
|     rat|
|     cat|
|     mat|
+--------+
13
Alexander