2016-03-24 10 views
13

SparkSQL 1.6 एपीआई (स्कैला) Dataframe में छेड़छाड़ और छोड़ने के लिए कार्य हैं, लेकिन अंतर के लिए कोई नहीं है। जाहिर है, संघ का संयोजन और इसके अलावा अंतर उत्पन्न करने के लिए उपयोग किया जा सकता है:दो डेटाफ्रेम के बीच अंतर कैसे प्राप्त करें?

df1.except(df2).union(df2.except(df1)) 

लेकिन यह थोड़ा अजीब लगता है। मेरे अनुभव में, अगर कुछ अजीब लगता है, तो इसे करने के लिए एक बेहतर तरीका है, खासकर स्कैला में।

उत्तर

16

तुम हमेशा के रूप में यह पुनर्लेखन कर सकते हैं:

df1.unionAll(df2).except(df1.intersect(df2)) 
हालांकि इस UNION, INTERSECT और EXCEPT/ MINUS

गंभीरता से काफी एसक्यूएल के संयोजन ऑपरेटरों के एक मानक सेट है। मुझे किसी भी प्रणाली से अवगत नहीं है जो एक्सओआर को बॉक्स के बाहर ऑपरेशन की तरह प्रदान करता है। सबसे अधिक संभावना है क्योंकि यह तीनों का उपयोग करके लागू करने के लिए तुच्छ है और वहां अनुकूलित करने के लिए बहुत कुछ नहीं है।

+0

धन्यवाद के रूप में पुनः लिखा जा सकता है। अगर यह वहां था, तो शायद यह कवर के तहत ऐसा कुछ भी करेगा। – WillD

2

नीचे क्यों नहीं?

df1.except(df2) 
+0

क्योंकि यह एक्सओआर नहीं करता है। मैं चौराहे में नहीं सभी तत्वों की तलाश में था। आपका कोड केवल डी 1 में तत्व देता है जो चौराहे में नहीं हैं। मुझे डी 2 में भी उन लोगों की आवश्यकता है जो चौराहे में नहीं हैं। – WillD

1

ध्यान दें कि EXCEPT (या MINUS जो EXCEPT के लिए केवल उपनाम है) डी-डुप्स परिणाम।

https://issues.apache.org/jira/browse/SPARK-21274

जैसा कि मैंने वहाँ लिखा था, सिवाय ": तो अगर आप उम्मीद सेट (diff आप का उल्लेख) + 'को छोड़कर" "एक दूसरे को काटना" मूल dataframe के बराबर होना करने के लिए सेट, इस सुविधा का अनुरोध है कि डुप्लिकेट रखता है पर विचार सभी "स्पार्क एसक्यूएल में

SELECT a,b,c 
FROM tab1 t1 
    LEFT OUTER JOIN 
     tab2 t2 
    ON (
     (t1.a, t1.b, t1.c) = (t2.a, t2.b, t2.c) 
    ) 
WHERE 
    COALESCE(t2.a, t2.b, t2.c) IS NULL 
संबंधित मुद्दे