2016-08-15 5 views
0

Я пытаюсь выполнить следующий запрос:Использование Scala перечислены в Спарк SQL запросов

val IgnoreList = List(""," ","0","-","{}","()","[]","null","Null","NULL","false","False","FALSE","NA","na","Na","n/a","N/a","N/A","nil","Nil","NIL") 
val df = sqlContext.sql(s"select userName from names where userName not in $IgnoreList") 

Но это не будет работать. Я также пробовал:

val IgnoreList = List(""," ","0","-","{}","()","[]","null","Null","NULL","false","False","FALSE","NA","na","Na","n/a","N/a","N/A","nil","Nil","NIL") 
sqlContext.udf.register("SqlList",(s: List[String]) => "('" + s.mkString("','") + "')") 
val df = sqlContext.sql(s"select userName from names where userName not in SqlList($IgnoreList)") 

Но это тоже не сработает. Какие-либо предложения?

ответ

1

Ваша первая попытка потерпит неудачу, потому что она вызывает по умолчанию значение ListString, которое не возвращает синтаксис SQL-valid, который вам нужен. Ваша вторая попытка не удалась, потому что нет смысла использовать UDF для построения строки SQL - UDF должны применяться к записям (или столбцам), а не для создания строковых запросов.

Вам необходимо форматирование сделано во втором, в сочетании с простой интерполяцией строк сделаны в первом:

val IgnoreList = List(""," ","0","-","{}","()","[]","null","Null","NULL","false","False","FALSE","NA","na","Na","n/a","N/a","N/A","nil","Nil","NIL") 
val condition = "('" + IgnoreList.mkString("','") + "')" 
val df = sqlContext.sql(s"select userName from names where userName not in $condition") 

Кстати, может быть понятнее форматирование списка таким образом:

IgnoreList.map(s => s"'$s'").mkString(",") 
Смежные вопросы