2016-08-15 3 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

リストのデフォルトのtoStringを呼び出すため、必要なSQL有効な構文が返されないため、最初の試行は失敗します。 UDFを使用してSQLストリングを作成する意味がないため、2回目の試行は失敗します。レコード(または複数の列)に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(",") 
関連する問題