2017-03-22 13 views
5
val df = sc.parallelize(Seq((1,"Emailab"), (2,"Phoneab"), (3, "Faxab"),(4,"Mail"),(5,"Other"),(6,"MSL12"),(7,"MSL"),(8,"HCP"),(9,"HCP12"))).toDF("c1","c2") 

+---+-------+ 
| c1|  c2| 
+---+-------+ 
| 1|Emailab| 
| 2|Phoneab| 
| 3| Faxab| 
| 4| Mail| 
| 5| Other| 
| 6| MSL12| 
| 7| MSL| 
| 8| HCP| 
| 9| HCP12| 
+---+-------+ 

मैं उन रिकॉर्ड्स को फ़िल्टर करना चाहता हूं जिनमें कॉलम 'सी 2' या तो 'एमएसएल' या 'एचसीपी' के पहले 3 अक्षर हैं।स्पार्क डेटाफ्रेम फ़िल्टर

तो आउटपुट नीचे जैसा होना चाहिए।

+---+-------+ 
| c1|  c2| 
+---+-------+ 
| 1|Emailab| 
| 2|Phoneab| 
| 3| Faxab| 
| 4| Mail| 
| 5| Other| 
+---+-------+ 

क्या कोई इस पर सहायता कर सकता है?

मुझे पता था कि df.filter($"c2".rlike("MSL")) - यह रिकॉर्ड चुनने के लिए है लेकिन रिकॉर्ड को कैसे बाहर निकालना है। ?

संस्करण: स्पार्क 1.6.2 स्काला: 2,10

+0

'वैल DF1 = df.filter (नहीं (df (" c2 ") ===" एम एस एल ") && नहीं (df (" c2 ") ===" HCP ")) ' मैं इस तरह कुछ कोशिश कर रहा हूँ। – Ramesh

+0

वैल df1 = df.filter (नहीं (डीएफ ("सी 2")। Rlike ("एमएसएल")) && नहीं (डीएफ ("सी 2")। Rlike ("एचसीपी")) – Ramesh

उत्तर

0

val df1 = df.filter(not(df("c2").rlike("MSL"))&&not(df("c2").rlike("HCP")))

यह काम किया।

+0

इस तरह से 'rlike' का उपयोग करना होगा "अन्यएमएसएल" जैसे स्ट्रिंग को फ़िल्टर करें, भले ही यह आपके द्वारा बताए गए पैटर्न से शुरू न हो। 'rlike ("^ एमएसएल") 'और' rlike ("^ एचसीपी")' का उपयोग करने की कोशिश करें। वैकल्पिक रूप से आप '.startsWith ("MSL")' फ़ंक्शन का भी उपयोग कर सकते हैं। – pheeleeppoo

+0

@ जेगन, पशाज़ दोनों जवाब सही हैं। – Ramesh

9

यह भी काम करता है। संक्षेप और एसक्यूएल के समान ही।

df.filter("c2 not like 'MSL%' and c2 not like 'HCP%'").show 
+---+-------+ 
| c1|  c2| 
+---+-------+ 
| 1|Emailab| 
| 2|Phoneab| 
| 3| Faxab| 
| 4| Mail| 
| 5| Other| 
+---+-------+ 
संबंधित मुद्दे