2016-08-30 4 views
0

Я пытаюсь запустить запрос на Cassandra через искру.Ошибка запроса cassandra нет жизнеспособной альтернативы на входе «ALLOW»

При выполнении этой команды:

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 «имя =" Джейн»в строку, я теряю сингл цитаты, поэтому я получаю «имя = Джейн», что, конечно, вызывает ошибку. Я попытался избежать одиночных кавычек с \ и со второй парой одинарных кавычек вокруг имени Jane {"clause": " name = ''Jane'' "}. Это не решает проблему.

Редактировать: После дальнейшего тестирования это, безусловно, json, который теряет одинарные кавычки, и CQL нуждается в них для выполнения запроса. Может ли кто-нибудь предложить способ избежать/сохранить присутствие одинарных кавычек? Я попытался убежать с \ двойными одинарными кавычками ''. Есть ли способ использовать JSON для обеспечения правильных целых высказываний CQL?

+0

Вы определили проблему, если вы можете получить эти кавычки через все будет хорошо. Я уверен, что они удаляются с помощью '.get.as [String]', поэтому я бы дважды проверял это. Я уверен, что '.where' не изменит вашу строку. – RussS

+0

Я действительно подозревал партию 'WHERE (« uuid »)>? И токен ("uuid") <=? AND', поскольку он появляется после предложения where, и я не включил его в строку, которую я проанализировал. Но да, после переключения на текст, чтобы проверить, был ли вопрос json, оказалось, что это так. Благодаря! – Mnemosyne

+0

Np, часть «токена» предназначена для выполнения работ в Spark. :) – RussS

ответ