如何使用spark sql筛选器作为不区分大小写的筛选器。适用于列条件的Spark SQL不区分大小写筛选器
例如:
dataFrame.filter(dataFrame.col("vendor").equalTo("fortinet"));
刚刚返回行是'vendor'
列等于'fortinet'
,但我想行时,'vendor'
列等于'fortinet'
或'Fortinet'
或'foRtinet'
或...
如何使用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
条件的平等是一个更好的选择。详情请参阅How can we JOIN two Spark SQL dataframes using a SQL-esque "LIKE" criterion?。
尝试使用下/上字符串函数:
dataFrame.filter(lower(dataFrame.col("vendor")).equalTo("fortinet"))
或
dataFrame.filter(upper(dataFrame.col("vendor")).equalTo("FORTINET"))
@ zero3232我有这个问题,所有的表。我的意思是我需要我的应用程序提供不区分大小写的结果。有什么解决方案,我可以得到像结果一样的SQLServer(它每次都忽略大小写)? –