2016-10-06 8 views
7

निर्दिष्ट करता है मेरे पास एक बड़ा डेटाटाम (एकाधिक कॉलम और पंक्तियों के अरबों) और एक छोटा डेटाटाम (एकल कॉलम और 10,000 पंक्तियां) है।फ़िल्टर स्पार्क डेटाफ्रेम किसी अन्य डेटाफ्रेम पर आधारित है जो ब्लैकलिस्ट मानदंड

मैं जब भी largeDataFrame में some_identifier स्तंभ smallDataFrame में पंक्तियों से मेल खाता largeDataFrame से सभी पंक्तियों को फ़िल्टर करना चाहते हैं।

largeDataFrame

some_idenfitier,first_name 
111,bob 
123,phil 
222,mary 
456,sue 

smallDataFrame

some_identifier 
123 
456 

desiredOutput

111,bob 
222,mary 

यहाँ मेरी बदसूरत समाधान है:

यहाँ एक उदाहरण है।

val smallDataFrame2 = smallDataFrame.withColumn("is_bad", lit("bad_row")) 
val desiredOutput = largeDataFrame.join(broadcast(smallDataFrame2), Seq("some_identifier"), "left").filter($"is_bad".isNull).drop("is_bad") 

क्या कोई क्लीनर समाधान है?

उत्तर

21

आपको इस मामले में leftanti शामिल होने की आवश्यकता होगी।

बाईं विरोधी में शामिल होने के एक के विपरीत अर्द्ध में शामिल होने के छोड़ दिया है।

यह किसी कुंजी के अनुसार बाईं तालिका में सही तालिका से डेटा को फ़िल्टर कर देता:

largeDataFrame 
    .join(smallDataFrame, Seq("some_identifier"),"leftanti") 
    .show 
// +---------------+----------+ 
// |some_identifier|first_name| 
// +---------------+----------+ 
// |   222|  mary| 
// |   111|  bob| 
// +---------------+----------+ 
+2

और यह कारण है कि आप स्ट्रिंग्स, का उपयोग नहीं करते हैं जब आप वास्तव में enums चाहते हैं - डेटासेट के scaladoc। जुड़ने के लिए बाएंंति का एक विकल्प के रूप में उल्लेख नहीं है, इसलिए यह पता लगाना असंभव है कि क्या विकल्प हैं - एक गहरे गोता लगाने के बिना। मुझे लगता है कि यह एक जिरा वारंट की तरह लग रहा है - और पहले से ही एपीआई की पसंद से पहले से ही peeved था। –

+1

ईमानदार होने के लिए, जब मैंने यह उत्तर लिखा, डेटासेट प्रयोगात्मक थे और मैं अभी भी एक बड़ा प्रशंसक नहीं हूं – eliasah

+2

शुक्र है कि जेसेक में शामिल होने के लिए पूर्ण (या तो मैं आशा करता हूं) दस्तावेज: https: //jaceklaskowski.gitbooks। io/mastering-apache-spark/content/spark-sql-joins.html - उम्मीद है कि इसे यहां छोड़कर किसी और के जीवन को आसान बना दिया जाएगा। –

संबंधित मुद्दे