2016-11-10 67 views
3

使用NOT IN從CSV文件我用星火SQL將數據加載到一個val這樣如何星火

val customers = sqlContext.sql("SELECT * FROM customers") 

但是我有一個包含一列CUST_ID和50,00行的單獨的txt文件。即

CUST_ID 
1 
2 
3 

我希望我的customers VAL有在customers表不在TXT文件中的所有客戶。

使用SQL我會通過SELECT * FROM customers NOT IN cust_id ('1','2','3')

爲此,我怎樣才能做到這一點使用火花?

我讀過的文本文件,我可以打印它行,但我不知道如何與我的sql查詢匹配這個

scala> val custids = sc.textFile("cust_ids.txt") 
scala> custids.take(4).foreach(println) 
CUST_ID 
1 
2 
3 

回答

3

你可以導入文本文件作爲一個數據幀,並做了左外連接:

val customers = Seq(("1", "AAA", "shipped"), ("2", "ADA", "delivered") , ("3", "FGA", "never received")).toDF("id","name","status") 
val custId = Seq(1,2).toDF("custId") 

customers.join(custId,'id === 'custId,"leftOuter") 
     .where('custId.isNull) 
     .drop("custId") 
     .show() 


+---+----+--------------+ 
| id|name|  status| 
+---+----+--------------+ 
| 3| FGA|never received| 
+---+----+--------------+ 
+0

我在火花殼得到這個錯誤,試圖重新建立你的例子:'VAL TEST1 = SEQ(1,2).toDF( 「客戶ID」)'錯誤:'錯誤:值toDF不是Seq [Int]的成員' – Anthony

+1

您是否使用Spark的2.0版本?然後sc.parallelize(Seq(1,2))。toDF(「custId」) – ulrich

+0

我的spark版本是'version 1.5.0'和scala版本是'Using Scala version 2.10.4' – Anthony