2016-01-20 102 views
5

如何使用spark sql筛选器作为不区分大小写的筛选器。适用于列条件的Spark SQL不区分大小写筛选器

例如:

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

刚刚返回行是'vendor'列等于'fortinet',但我想行时,'vendor'列等于'fortinet''Fortinet''foRtinet'或...

回答

11

您可以使用不区分大小写的正则表达式:

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?

+0

@ zero3232我有这个问题,所有的表。我的意思是我需要我的应用程序提供不区分大小写的结果。有什么解决方案,我可以得到像结果一样的SQLServer(它每次都忽略大小写)? –

9

尝试使用下/上字符串函数:

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

dataFrame.filter(upper(dataFrame.col("vendor")).equalTo("FORTINET"))