2016-01-20 17 views

Odpowiedz

11

Można wykorzystanie rozróżnianie wielkości liter:

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

lub proste równość z 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| 
// +---+--------+ 

Dla prostych filtrów wolałbym rlike chociaż wydajność powinna być podobna, do join warunkach równości jest znacznie lepszym wyborem. Aby uzyskać szczegółowe informacje, patrz How can we JOIN two Spark SQL dataframes using a SQL-esque "LIKE" criterion?.

+0

@ zero3232 mam ten problem z całej tabeli. Chodzi mi o to, że potrzebuję, aby moja aplikacja zapewniała wielkość liter. czy istnieje rozwiązanie, dzięki któremu można uzyskać wyniki SQLServer (gdzie ignoruje przypadek za każdym razem)? –

9

spróbuje użyć dolne/górne funkcji ciągu:

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

lub

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