针对列条件的 Spark SQL 不区分大小写筛选器



如何使用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)

相关内容

  • 没有找到相关文章

最新更新