2016-03-24 28 views
13

1.6 API (scala) Dataframe'un kesişim için işlevler vardır, ancak hepsi bir fark için değil. Açıkçası, birliğin ve dışında bir kombinasyon farkı oluşturmak için kullanılabilir:İki DataFrames arasındaki fark nasıl elde edilir?

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

Ama bu biraz garip görünüyor. Deneyimlerime göre, bir şey garip görünüyorsa, özellikle Scala'da bunu yapmak için daha iyi bir yol var.

cevap

16

Hep olarak yeniden yazabilirsiniz: Bu UNION, INTERSECT ve EXCEPT/MINUS olsa Ciddi

df1.unionAll(df2).except(df1.intersect(df2)) 

hemen hemen SQL birleştirerek operatörlerin standart kümesidir. XOR'un operasyondan çıkmasını sağlayan herhangi bir sistemden haberdar değilim. Büyük olasılıkla diğer üç kullanarak uygulamak için önemsiz ve orada optimize etmek için çok fazla değil çünkü.

+0

Yeniden yazılabilir. Orada olsaydı, muhtemelen kapakların altında böyle bir şey yapardı. – WillD

2

neden aşağıda değil?

df1.except(df2) 
+0

Çünkü bu bir XOR gerçekleştirmiyor. Kesişimde olmayan tüm elemanları arıyordum. Kodunuz d1'deki kesişme noktasında olmayan öğeleri döndürür. Ayrıca, d2'de kesişme noktasında olmayanlara da ihtiyacım var. – WillD

1

EXCEPT (veya EXCEPT için başka bir ad olan MINUS) sonuçlarının giderileceğine dikkat edin. HARİÇ", orada yazdığı gibi

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

: Yani set (fark Bahsettiğiniz) + "haricinde" bekliyorsanız "kesiştiği" orijinal dataframe eşit olacak şekilde ayarlayın çiftleri tutan bu özellik isteği dikkate TÜM "Spark SQL'de

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