【问题标题】:"Missing EOF" Error message when querying using the spark-cassandra-connector使用 spark-cassandra-connector 查询时出现“缺少 EOF”错误消息
【发布时间】:2017-05-05 21:37:27
【问题描述】:

我想通过以下语句使用 spark-cassandra-connector 查询 cassandra 表:

sc.cassandraTable("citizens","records")
  .select("identifier","name")
  .where( "name='Alice' or name='Bob' ")

我收到此错误消息:

org.apache.spark.SparkException: Job aborted due to stage failure: 
Task 0 in stage 81.0 failed 4 times, most recent failure: 
Lost task 0.3 in stage 81.0 (TID 9199, mydomain): 
java.io.IOException: Exception during preparation of 
SELECT "identifier", "name" FROM "citizens"."records" WHERE token("id") > ? AND token("id") <= ? AND name='Alice' or name='Bob'   LIMIT 10 ALLOW FILTERING:
line 1:127 missing EOF at 'or' (...<= ? AND name='Alice' [or] name...)

我在这里做错了什么以及如何使用连接器的where 子句进行or 查询?

【问题讨论】:

    标签: cassandra cql spark-cassandra-connector


    【解决方案1】:

    您的 OR 子句不是有效的 CQL。对于这几个键值(我假设name 是一个键),您可以使用IN 子句。

    .where( "name in ('Alice', 'Bob') ")
    

    where 子句用于将 CQL 下推到 Cassandra,因此只有有效的 CQL 可以进入其中。如果您希望使用 Spark Side Sql-Like 语法,请查看 SparkSql 和数据集。

    【讨论】:

    • 其实name不是主键,只是表中的某个列。当我运行您的建议 LIMIT 10 ALLOW FILTERING: IN predicates on non-primary-key columns (name) is not yet supported 时,我收到此错误消息。 name 的值不是唯一的。有许多不同的条目共享name 字段。有没有其他方法可以利用连接器,或者这是只有 spark sql 可以做的事情?
    • 如果 Name 只是一个随机列,那么连接器将仅用于完全加载此表。连接器无法比 Spark 更有效地找到这些值。如果您的“In 值”集足够大,您应该查看各种 Spark 连接。
    • 好的,我现在明白这超出了连接器的范围。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多