2016-07-05 11 views
8

Her bir kelime kendi satırında bir DataFrame'e sözcük listelerini içeren bir DataFrame'den dönüştürmek istiyorum.PySpark'ta Patlatma

DataFrame'deki bir sütunda nasıl patlayabilirim?

Aşağıda, her bir kod satırını engelleyebileceğiniz ve aşağıdaki yorumda listelenen hatayı alabileceğiniz bazı girişimlerimden bir örnek verilmiştir. PySpark'ı Spark 1.6.1 ile Python 2.7'de kullanıyorum.

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

cevap

13

explode ve split SQL fonksiyonları tavsiye ediniz. Her ikisi de SQL Column'da çalışır. split, Java argümanını ikinci argüman olarak alır. Eğer keyfi boşluk verileri ayırmak istiyorsanız böyle bir şey gerekir:

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

where madde eklemek, boşluklarla ayrılır ve aynı zamanda boş satırlar kaldırın.

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

Eklenen tümce için teşekkürler. – user1982118

+1

Birden fazla sütunun bildirilmesi gereken durumları genelleştirebilen biraz daha eksiksiz bir çözüm için 'selectColumn' yerine basit 'select' kullanın: df.withColumn ('word', explode ('word')) .show() Bu, DataFrame'deki tüm sütunların patlatıldıktan sonra DataFrame çıkışında hala mevcut olduğunu garanti eder. Bu, aynı zamanda, seçilmesi gereken her bir sütunu belirtmekten de daha kolaydır: df.select ('col1', 'col2', ..., 'colN', ('word') patlat). –