2016-01-20 18 views
5

Kıvılcım sql filtresini büyük/küçük harf duyarlı filtre olarak nasıl kullanabilirsiniz.Spark Sütun koşulları için SQL kasası duyarsız filtresi

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

sadece 'vendor' kolon 'fortinet' eşittir satırları dönmek ama ben ... 'fortinet' veya 'Fortinet' veya 'foRtinet' veya 'vendor' sütun eşit

cevap

11

yapabilirsiniz ya kullanım satırları istiyorum: Örneğin

büyük/küçük harfe duyarlı normal ifade:

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| 
// +---+--------+ 

ya lower/upper basit eşitlik: performans benzer olmalıdır rağmen

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| 
// +---+--------+ 

basit filtreler için ben join koşulları için eşitlik çok daha iyi bir seçimdir, rlike tercih ediyorum. Detaylar için bakınız How can we JOIN two Spark SQL dataframes using a SQL-esque "LIKE" criterion?.

+0

zero3232 @ tüm tabloyla bu sorun var. Demek istediğim, uygulamamın büyük/küçük harfe duyarlı bir sonuç vermesi gerekiyor. SQLServer gibi sonuçlar alabileceğim herhangi bir çözüm var mı (her zaman durumun göz ardı edildiği yerde)? –

9

deneyin alt/üst dize işlevlerini kullanmak:

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

veya

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