我正试图通过spark在Cassandra上运行查询。
运行此命令时:
val test = sc.cassandraTable[Person](keyspace,table)
.where("name=?","Jane").collect
我得到了查询的相应输出。
当我尝试使用where
语句作为整个字符串输入查询时,我收到错误。
我以json:
的身份收到查询{"clause": " name = 'Jane' "}
然后把它变成一个字符串。
运行时
val query = (json \ "clause").get.as[String]
//turns json value into a string
val test = sc.cassandraTable[Person](keyspace,table)
.where(query).collect
我收到以下错误:
java.io.IOException: Exception during preparation of SELECT "uuid", "person", "age" FROM "test"."users" WHERE token("uuid") > ? AND token("uuid") <= ? AND name = Jane ALLOW FILTERING: line 1:232 no viable alternative at input 'ALLOW' (...<= ? AND name = [Jane] ALLOW...)
at com.datastax.spark.connector.rdd.CassandraTableScanRDD.createStatement(CassandraTableScanRDD.scala:288)
at com.datastax.spark.connector.rdd.CassandraTableScanRDD.com$datastax$spark$connector$rdd$CassandraTableScanRDD$$fetchTokenRange(CassandraTableScanRDD.scala:302)
at com.datastax.spark.connector.rdd.CassandraTableScanRDD$$anonfun$18.apply(CassandraTableScanRDD.scala:328)
at com.datastax.spark.connector.rdd.CassandraTableScanRDD$$anonfun$18.apply(CassandraTableScanRDD.scala:328)
at scala.collection.Iterator$$anon$12.nextCur(Iterator.scala:434)
at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:440)
at com.datastax.spark.connector.util.CountingIterator.hasNext(CountingIterator.scala:12)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at com.datastax.spark.connector.util.CountingIterator.foreach(CountingIterator.scala:4)
at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:59)
我怀疑当我将json值“name ='Jane'”转换为字符串时,我会丢失单引号,因此我得到“name = Jane”,这当然会引发错误。我尝试使用\以及名为Jane {"clause": " name = ''Jane'' "}
的第二对单引号转义单引号。它没有解决问题。
编辑:经过进一步测试后,肯定是json丢失了单引号,而CQL需要它们来执行查询。任何人都可以提出一种方法来逃避/保存单引号的存在吗?我尝试使用\
双引号''
进行转义。有没有办法使用JSON提供正确的整个CQL语句?
答案 0 :(得分:1)
请使用Unicode字符\u0027
。