Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
order by子句在Cassandra查询中不起作用_Cassandra - Fatal编程技术网

order by子句在Cassandra查询中不起作用

order by子句在Cassandra查询中不起作用,cassandra,Cassandra,我使用以下代码创建了一个表层: CREATE TABLE layer ( layer_name text, layer_position text, PRIMARY KEY (layer_name, layer_position) ) WITH CLUSTERING ORDER BY (layer_position DESC) 我使用以下查询以降序(层)从层表中获取数据: $select=new Cassandra\SimpleStatement(简单地说,Cassan

我使用以下代码创建了一个表层:

CREATE TABLE layer (
    layer_name text,
    layer_position text,
    PRIMARY KEY (layer_name, layer_position)
) WITH CLUSTERING ORDER BY (layer_position DESC)
我使用以下查询以降序(层)从层表中获取数据:


$select=new Cassandra\SimpleStatement(简单地说,Cassandra只在分区键内强制执行排序顺序

PRIMARY KEY (layer_name, layer_position)
) WITH CLUSTERING ORDER BY (layer_position DESC)
在这种情况下,
layer\u name
是您的分区键。如果在WHERE子句中指定
layer\u name
,则
layer\u name
值的结果将按
layer\u position
排序

SELECT * FROM layer WHERE layer_name = 'layer1';
您不需要指定ORDER BY。ORDER BY在查询级别真正可以做的就是应用不同的排序方向(升序与降序)

Cassandra就是这样工作的,因为它被设计成以磁盘上的任何排序顺序来读取数据。分区键是按哈希标记值排序的,这就是为什么unbound WHERE子句的结果看起来是随机排序的

编辑

我必须使用
state\u id
列获取数据,并且应该按
层位置
排序

SELECT * FROM layer WHERE layer_name = 'layer1';
Cassandra表针对特定查询进行了优化。虽然这会带来高性能,但缺点是查询灵活性有限。解决此问题的方法是将数据复制到为该特定查询服务的附加表中

CREATE TABLE layer_by_state_id (
    layer_name text,
    layer_position text,
    state_id text,
    PRIMARY KEY (state_id, layer_position, layer_name)
) WITH CLUSTERING ORDER BY (layer_position DESC, layer_name ASC);
此表将允许这样的查询工作:

SELECT * FROM layer WHERE state_id='thx1138';
并且结果将按所请求的
状态id
内的
层位置进行排序

现在我做了两个假设,你会想调查:

  • 我假设
    state\u id
    是一个很好的分区键。这意味着它具有足够高的基数,可以在集群中提供良好的分布,但其基数足够低,可以返回足够多的CQL行,从而使排序更有价值
  • 我假设
    state\u id
    layer\u position
    的组合不足以唯一地标识每一行。因此,我通过添加
    layer\u name
    作为额外的聚类键来确保唯一性。您可能需要,也可能不需要,但我猜您会需要
  • 我假设使用
    state\u id
    作为分区键不会出现未绑定的增长,从而接近Cassandra的每个分区20亿个单元的限制。如果是这种情况,您可能需要添加一个额外的分区“bucket”

    • 您不能在Cassandra中直接使用
      orderby


      只有当分区键受
      EQ
      中的
      限制时,才能在群集列上应用
      orderby

      您可以通过创建Materialized view表在cassandra中使用order by子句。

      这可能会对您有所帮助:-谢谢,但我也尝试过,但它无法工作然后,它给出了错误,如:只有当分区键受EQ或IN限制时,才支持ORDER BY。但我不明白这个问题。请检查这两个类似的问题:-我参考了以上两个链接…是否需要在我要用于ORDER BY的字段上创建主键?您好,我有一个在这个层表中还有一个额外的字段state\u id。我必须使用state\u id列获取数据,它应该按层位置排序。state\u id列包含一个重复的值。在这种情况下,我尝试了你的代码,但没有得到预期的结果。@Aaron-非常感谢……现在它按照我的预期工作。很抱歉,你说的是什么意思“只有当分区键受EQ或IN限制时,才能在群集列上应用order by。”我是卡桑德拉·努布。@shubhamsharma谢谢。我在翻阅了大量帖子后发现了它。应该回到SO并发布我的发现:(