2017-03-13 27 views
2

我有具有以下結構的CSV:過濾RDD線由值字段的Scala

頭,報頭,報頭,報頭,報頭
VAL1,VAL2,VAL3,VAL4,val5
VAL1 ,值2,空,VAL4,val5
VAL1,VAL2,VAL3,空,val5

我需要做的是過濾掉的報頭和數據的,在特定位置包含空值的行什麼(它是確定在val3有一個空值,但不是val4)。我做了一個RDD和分裂的逗號行,我希望是進入每一行像一個數組的索引位置。但我無法找到如何做比較。我可以提取與字段:

rdd.map(值=>(值(2))

你怎麼做的比較特別是 「不包含」 我想呢?。 !?是一個比較可用的方法或確實這個問題需要一個元組包含

+1

有沒有,你將需要使用RDD任何約束?如果沒有,我認爲,你可以使用DataFrame。 SPARK的DataFrame API最適合處理CSV文件的操作。 – Tawkir

回答

3

假設你已經包裹這些值定義的類型,比方說:

case class Record(val1: String, val2: Option[String], val3: String, val4: Option[String]) 

val rdd: RDD[Record] = ... 
rdd.filter(record => record.val2.isDefined && record.val4.isDefined) 

我希望這是有幫助的。

2

如果您使用DataFrame而不是RDD s,您可以使用filter以及布爾型Column操作。

假設既不val4也不val5應爲空。

如果CSV看起來是這樣的:

[email protected] ~ > cat dat_1.csv 
header1,header2,header3,header4,header5 
val1,val2,val3,val4,val5 
val1,val2,,val4,val5 
val1,val2,val3,,val5 

那麼你的代碼看起來像:

scala> val dat_1 = spark.read.option("header", true).csv("dat_1.csv") 
dat_1: org.apache.spark.sql.DataFrame = [header1: string, header2: string ... 3 more fields] 

scala> dat_1.show 
+-------+-------+-------+-------+-------+ 
|header1|header2|header3|header4|header5| 
+-------+-------+-------+-------+-------+ 
| val1| val2| val3| val4| val5| 
| val1| val2| null| val4| val5| 
| val1| val2| val3| null| val5| 
+-------+-------+-------+-------+-------+ 


scala> data1.filter($"header4".isNotNull && $"header5".isNotNull).show 
+-------+-------+-------+-------+-------+ 
|header1|header2|header3|header4|header5| 
+-------+-------+-------+-------+-------+ 
| val1| val2| val3| val4| val5| 
| val1| val2| null| val4| val5| 
+-------+-------+-------+-------+-------+ 

否則,如果你的數據是這樣的:

[email protected] ~ > cat dat_2.csv 
header1,header2,header3,header4,header5 
val1,val2,val3,val4,val5 
val1,val2,null,val4,val5 
val1,val2,val3,null,val5 

那麼你的代碼應該是這樣的:

scala> val dat_2 = spark.read.option("header", true).csv("dat_2.csv") 
dat_2: org.apache.spark.sql.DataFrame = [header1: string, header2: string ... 3 more fields] 

scala> dat_2.show 
+-------+-------+-------+-------+-------+ 
|header1|header2|header3|header4|header5| 
+-------+-------+-------+-------+-------+ 
| val1| val2| val3| val4| val5| 
| val1| val2| null| val4| val5| 
| val1| val2| val3| null| val5| 
+-------+-------+-------+-------+-------+ 


scala> dat_2.filter($"header4" =!= "null" && $"header5" =!= "null").show 
+-------+-------+-------+-------+-------+ 
|header1|header2|header3|header4|header5| 
+-------+-------+-------+-------+-------+ 
| val1| val2| val3| val4| val5| 
| val1| val2| null| val4| val5| 
+-------+-------+-------+-------+-------+