列条件的Spark SQL不区分大小写的过滤器

时间:2016-01-20 07:52:10

标签: apache-spark apache-spark-sql

如何使用Spark SQL过滤器作为不区分大小写的过滤器。

例如:

dataFrame.filter(dataFrame.col("vendor").equalTo("fortinet"));

只返回'vendor'列等于'fortinet'的行,但我想要'vendor'列等于'fortinet''Fortinet'或{{1}的行或者......

2 个答案:

答案 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"))