如何使用Spark SQL过滤器作为不区分大小写的过滤器?
例如:
dataFrame.filter(dataFrame.col("vendor").equalTo("fortinet"));
它只返回'vendor'
列等于 'fortinet'
的行,但我想要'vendor'
列等于 'fortinet'
或 'Fortinet'
或 'foRtinet'
或 ...
您可以使用不区分大小写的正则表达式:
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
条件,平等是一个更好的选择。请参阅如何使用 SQL 式的"LIKE"标准连接两个 Spark SQL 数据帧?了解详情。
尝试使用下/高字符串函数:
dataFrame.filter(lower(dataFrame.col("vendor")).equalTo("fortinet"))
或
dataFrame.filter(upper(dataFrame.col("vendor")).equalTo("FORTINET"))
另一种保存几组括号的替代方案:
import pyspark.sql.functions as f
df.filter(f.upper("vendor") == "FORTINET)