2016-04-27 204 views
9

什麼是在Scala API中對多個列進行過濾的過濾語法?如果我想要做這樣的事情:Spark SQL過濾器多個字段

dataFrame.filter($"col01" === "something" && $"col02" === "something else") 

dataFrame.filter($"col01" === "something" || $"col02" === "something else") 

編輯:

這是我原來的代碼如下所示。一切都以字符串形式出現。

df.select($"userID" as "user", $"itemID" as "item", $"quantity" cast("int"), $"price" cast("float"), $"discount" cast ("float"), sqlf.substring($"datetime", 0, 10) as "date", $"group") 
    .filter($"item" !== "" && $"group" !== "-1") 
+0

看起來不錯。你遇到任何問題嗎? – zero323

+1

如果它不起作用,您可能會丟失'import sqlContext.implicits._',其中'sqlContext'是'SQLContext'或'HiveContext'的實例。 –

+0

我得到「值&&不是String的成員」。解決方法是將每個語句包裝在括號中。 – gstvolvr

回答

14

我想我明白了什麼是問題。出於某種原因,火花不允許兩個!=在同一個過濾器。需要看看如何在Spark源代碼中定義filter

現在爲您的代碼工作,你可以用這個來做過濾

df.filter(col("item").notEqual("") && col("group").notEqual("-1")) 

,或者使用兩個過濾器在同一份聲明中

df.filter($"item" !== "").filter($"group" !== "-1").select(....) 

此鏈接here可以用不同的火花方法幫助。

+0

Hi @dheee?你知道這兩個選項是否表現相同? – servatj

+1

@servatj我還沒有看到我的表現有什麼不同。 – dheee

+0

!==類中的列已棄用且!==與===的優先級不同。所以我重新使用=!=來代替。 –