2017-03-22 123 views
5
val df = sc.parallelize(Seq((1,"Emailab"), (2,"Phoneab"), (3, "Faxab"),(4,"Mail"),(5,"Other"),(6,"MSL12"),(7,"MSL"),(8,"HCP"),(9,"HCP12"))).toDF("c1","c2") 

+---+-------+ 
| c1|  c2| 
+---+-------+ 
| 1|Emailab| 
| 2|Phoneab| 
| 3| Faxab| 
| 4| Mail| 
| 5| Other| 
| 6| MSL12| 
| 7| MSL| 
| 8| HCP| 
| 9| HCP12| 
+---+-------+ 

我想過濾掉列'c2'的前3個字符'MSL'或'HCP'的記錄。火花數據幀過濾器

所以輸出結果應該如下。

+---+-------+ 
| c1|  c2| 
+---+-------+ 
| 1|Emailab| 
| 2|Phoneab| 
| 3| Faxab| 
| 4| Mail| 
| 5| Other| 
+---+-------+ 

任何人都可以幫忙嗎?

我知道df.filter($"c2".rlike("MSL")) - 這是爲了選擇記錄,但如何排除記錄。 ?

版本:1.6.2星火斯卡拉 :2.10

+0

'VAL DF1 = df.filter(未(DF( 「C2」)=== 「MSL」)&&未(DF( 「C2」)=== 「HCP」)) '我正在嘗試這樣的事情。 – Ramesh

+0

val df1 = df.filter(not(df(「c2」)。rlike(「MSL」))&& not(df(「c2」)。rlike(「HCP」))) – Ramesh

回答

2
df.filter(not(
    substring(col("c2"), 0, 3).isin("MSL", "HCP")) 
    ) 
0

val df1 = df.filter(not(df("c2").rlike("MSL"))&&not(df("c2").rlike("HCP")))

這個工作。

+0

以這種方式使用'rlike'還要像「OtherMSL」那樣過濾字符串,即使它不是以您所說的模式開頭。 嘗試使用rlike(「^ MSL」)和'rlike(「^ HCP」)。 或者,您也可以使用'.startsWith(「MSL」)'功能。 – pheeleeppoo

+0

@Jegan,pashaz這兩個答案都是正確的。 – Ramesh

9

這也適用。簡潔且非常類似於SQL。

df.filter("c2 not like 'MSL%' and c2 not like 'HCP%'").show 
+---+-------+ 
| c1|  c2| 
+---+-------+ 
| 1|Emailab| 
| 2|Phoneab| 
| 3| Faxab| 
| 4| Mail| 
| 5| Other| 
+---+-------+