2016-07-05 16 views
8

में विस्फोट करना मैं डेटाफ्रेम से बदलना चाहता हूं जिसमें प्रत्येक शब्द के साथ डेटाफ्रेम में शब्दों की सूचियां शामिल हैं।PySpark

मैं डेटाफ्रेम में कॉलम पर कैसे विस्फोट कर सकता हूं?

यहां मेरे कुछ प्रयासों के साथ एक उदाहरण दिया गया है जहां आप प्रत्येक कोड लाइन को असम्बद्ध कर सकते हैं और निम्न टिप्पणी में सूचीबद्ध त्रुटि प्राप्त कर सकते हैं। मैं स्पार्क 1.6.1 के साथ पायथन 2.7 में पायस्पार्क का उपयोग करता हूं।

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

explode और split एसक्यूएल कार्य हैं। दोनों SQL Column पर काम करते हैं। split एक जावा तर्क नियमित अभिव्यक्ति के रूप में एक दूसरे तर्क के रूप में लेता है। आप मनमाने ढंग से खाली स्थान के पर डेटा को अलग करने चाहते हैं तो आप कुछ इस तरह की आवश्यकता होगी:

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 खंड को जोड़ने के लिए।

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

एक और अधिक पूर्ण समाधान के लिए जो एक से अधिक स्तंभों की रिपोर्ट की जानी चाहिए, सामान्य 'चयन' यानी df.withColumn ('word', विस्फोट ('शब्द') के बजाय 'कॉलम' का उपयोग करें।) .show() यह गारंटी देता है कि डेटाफ्रेम में शेष सभी कॉलम अभी भी विस्फोट का उपयोग करने के बाद आउटपुट डेटाफ्रेम में मौजूद हैं। यह प्रत्येक कॉलम को निर्दिष्ट करने से भी आसान है जिसे चुनने की आवश्यकता है i.e .: df.select ('col1', 'col2', ..., 'colN', विस्फोट ('शब्द'))।() –