2016-07-05 5 views
8

単語のリストを含む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() 

答えて

13

explodesplitはSQL関数ですアドバイスをしてください。どちらもSQL Columnで動作します。 splitはJavaの正規表現を第2引数として取ります。空白で分割しても空白行を削除し、where句を追加するには

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| 
## +--------+ 
6

:あなたは、任意の空白のデータを分離したい場合には、このようなものが必要になります。

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| 
+--------+ 
+0

追加されていただきありがとうございます。 – user1982118

+1

2つ以上の列を報告する必要がある場合に一般化できるもう少し完全な解決法については、単純な「選択」の代わりに「withColumn」を使用してください: df.withColumn( 'word'、explode( 'word') ).show() これは、爆発を使用した後、DataFrameの残りの列がすべて出力DataFrameにまだ存在することを保証します。これは、選択する必要があるすべての列を指定するよりも簡単です。 df.select( 'col1'、 'col2'、...、 'colN'、explode( 'word')) –