私はspark経由でCassandraのクエリを実行しようとしています。入力 'ALLOW'で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"を取得しますが、もちろんエラーが発生します。私は、\と単一引用符をエスケープしようとしました。そして、名前Jane {"clause": " name = ''Jane'' "}
の周りに二重引用符をつけます。それは問題を解決しません。
編集:さらにテストした後は、一重引用符が失われたjsonであり、CQLはクエリを実行する必要があります。誰でもシングル引用符の存在をエスケープ/保存する方法を提案できますか? \
二重引用符''
でエスケープしようとしました。適切な全体のCQL文を提供するためにJSONを使用する方法はありますか?
問題を特定しました。これらの引用符を使用すれば、うまくいくはずです。私は '.get.as [String]'によってそれらが削除されていると確信していますので、私はそれを再度確認します。 '.where'があなたの文字列を変更しないと確信しています。 – RussS
私は実際に 'WHERE token(" uuid ")>の部分を疑っていましたか? ANDトークン( "uuid")<=?それはwhere句の後に現れ、私が解析した文字列にはそれを含めなかったからです。しかし、ええ、jsonが問題だったかどうかテストするためにテキストに切り替えた後、それがそれであることが分かりました。ありがとう! – Mnemosyne
Npの場合、「トークン」部分はSparkで作業の配布を行うための部分です。 :) – RussS