2017-04-10 4 views
0

Gegeben Datenrahmen df_a und df_b, wie kann ich das gleiche Ergebnis erzielen wie links ohne beitreten:Spark-SQL 1.5.2: links ohne beitreten

SELECT df_a.* 
FROM df_a 
    LEFT JOIN df_b 
    ON df_a.id = df_b.id 
WHERE df_b.id is NULL 

Ich habe versucht:

df_a.join(df_b, df_a("id")===df_b("id"), "left") 
    .select($"df_a.*") 
    .where(df_b.col("id").isNull) 

I eine Ausnahme von der oben erhalten:

Exception in thread "main" java.lang.RuntimeException: Unsupported literal type class scala.runtime.BoxedUnit() 

Antwort

0

können Sie versuchen, Ausführen von SQL-Abfrage selbst - halten ing es einfach ..

df_a.registerTempTable("TableA") 
df_b.registerTempTable("TableB") 
result = sqlContext.sql("SELECT * FROM TableA A \ 
          LEFT JOIN TableB B \ 
          ON A.id = B.id \ 
          WHERE B.id is NULL ") 
0

Wenn Sie es durch Datenrahmen unter Beispiel versuchen tun möchten:

import sqlContext.implicits._ 
    val df1 = sc.parallelize(List("a", "b", "c")).toDF("key1") 
    val df2 = sc.parallelize(List("a", "b")).toDF("key2") 

    import org.apache.spark.sql.functions._ 

    df1.join(df2, 
    df1.col("key1") <=> df2.col("key2"), 
    "left") 
    .filter(col("key2").isNull) 
    .show 

Sie würden Ausgabe:

+----+----+ 
|key1|key2| 
+----+----+ 
| c|null| 
+----+----+