2016-07-05 15 views
8

Chciałbym przekształcić z DataFrame, która zawiera listy słów do DataFrame z każdym słowem w osobnym wierszu.Eksplodować w PySpark

Jak mogę eksplodować w kolumnie w DataFrame?

Oto przykład niektórych moich prób, w których można odkomentować każdą linię kodu i uzyskać błąd wymieniony w poniższym komentarzu. Używam PySpark w Pythonie 2.7 z 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() 

Proszę o poradę

Odpowiedz

13

explode i split są funkcje SQL. Oba działają na SQL Column. split przyjmuje wyrażenie regularne Java jako drugi argument. Jeśli chcesz, aby oddzielić dane dotyczące dowolnego spacji trzeba coś takiego:

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

Aby podzielić na spacji i również usunąć puste wiersze, dodać klauzulę 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| 
+--------+ 
+0

Dziękujemy za dodanie klauzuli where. – user1982118

+1

Dla nieco bardziej kompletnego rozwiązania, które można uogólnić do przypadków, w których trzeba zgłosić więcej niż jedną kolumnę, należy użyć "zKolumną" zamiast zwykłego "wybierz", tj .: df.withColumn ("słowo", eksplodować ("słowo")) .show() Gwarantuje to, że wszystkie pozostałe kolumny w DataFrame są nadal obecne w wyjściowym DataFrame, po użyciu eksploduje. Jest to również prostsze niż określenie każdej kolumny, która musi być wybrana, np .: df.select ('col1', 'col2', ..., 'colN', eksplodować ("słowo")). Show() –