【问题标题】:What's wrong with this cassandra prepared statement call?这个 cassandra 准备好的语句调用有什么问题?
【发布时间】:2015-04-25 12:41:51
【问题描述】:

我正在为 python 使用 datastax cassandra 驱动程序。

有问题的代码部分是:

cql = "SELECT * FROM iptools.geo2ip WHERE geo_key = ? AND (( geohash >= ? AND geohash < ? ) OR ( geohash >= ? AND geohash < ? ));"
print cql
prepared = self.session.prepare(cql)

结果是:

SELECT * FROM iptools.geo2ip WHERE geo_key = ? AND (( geohash >= ? AND geohash < ? ) OR ( geohash >= ? AND geohash < ? ));
cassandra.protocol.SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:82 missing EOF at ')' (...? AND geohash < ? [)];)">

我不确定括号周围的括号是从哪里来的,只要我删除括号,prepare 语句就会起作用。

想法?

【问题讨论】:

  • 我很确定这是因为 CQL 不包含 OR 关键字的定义。
  • 那个和括号在 CQL 中的工作方式与在 SQL 中的工作方式不同。我会一起摆脱它们。
  • 您能发表您的CREATE TABLE geo2ip 声明吗?这将有助于弄清楚如何获得您正在寻找的东西。
  • @BryceAtNetwork23 - 如果您想将“或”语句作为答案,我会接受。这就是问题所在。我只会做多个查询。现在我要解决我认为是布隆表导致的内存问题 - 我在进行范围查询时堆空间不足 - 涉及大约 20 亿行。

标签: python cassandra datastax


【解决方案1】:

我很确定这是因为 CQL 不包含 OR 关键字的定义。代替OR 的一种快捷方式是IN

SELECT * FROM geo2ip WHERE geo_key IN (?,?);

尽管事先警告IN 表现不佳。但是,我认为这对您没有多大帮助,因为您似乎希望能够对geohash 进行范围查询。根据您的 PRIMARY KEY 定义(例如,geo_key 作为分区键,geohash 作为集群键), this (minus the complexOR` 逻辑)应该仍然有效:

SELECT * FROM iptools.geo2ip WHERE geo_key = ? AND geohash >= ? AND geohash < ?;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2015-08-13
    • 2011-07-13
    相关资源
    最近更新 更多