如何使用Spark SQL过滤器作为不区分大小写的过滤器。
例如:
dataFrame.filter(dataFrame.col("vendor").equalTo("fortinet"));
只返回'vendor'
列等于'fortinet'
的行,但我想要'vendor'
列等于'fortinet'
或'Fortinet'
或{{1}的行或者......
答案 0 :(得分:19)
您可以使用不区分大小写的正则表达式:
val df = sc.parallelize(Seq(
(1L, "Fortinet"), (2L, "foRtinet"), (3L, "foo")
)).toDF("k", "v")
df.where($"v".rlike("(?i)^fortinet$")).show
// +---+--------+
// | k| v|
// +---+--------+
// | 1|Fortinet|
// | 2|foRtinet|
// +---+--------+
或与lower
/ upper
的简单平等:
import org.apache.spark.sql.functions.{lower, upper}
df.where(lower($"v") === "fortinet")
// +---+--------+
// | k| v|
// +---+--------+
// | 1|Fortinet|
// | 2|foRtinet|
// +---+--------+
df.where(upper($"v") === "FORTINET")
// +---+--------+
// | k| v|
// +---+--------+
// | 1|Fortinet|
// | 2|foRtinet|
// +---+--------+
对于简单的过滤器,我更喜欢rlike
虽然性能应该相似,但对于join
条件,相等性是一个更好的选择。有关详细信息,请参阅How can we JOIN two Spark SQL dataframes using a SQL-esque "LIKE" criterion?。
答案 1 :(得分:11)
尝试使用低/高字符串函数:
dataFrame.filter(lower(dataFrame.col("vendor")).equalTo("fortinet"))
或
dataFrame.filter(upper(dataFrame.col("vendor")).equalTo("FORTINET"))