【问题标题】:Cassandra materialized view won't let me filterCassandra物化视图不会让我过滤
【发布时间】:2019-09-07 03:09:34
【问题描述】:

我创建了一个物化视图:

CREATE MATERIALIZED VIEW test_view AS SELECT state, city, zip, loc, pop FROM citylist WHERE state IS NOT NULL AND city 不为空且 zip 不为空且 pop 不为空
PRIMARY KEY (state,city,pop,zip) WITH CLUSTERING ORDER BY (state ASC)。

我从查询“SELECT * FROM test_view Where state='NY'LIMIT 15;”中得到结果如:

state | city         | pop   | zip   | loc
-------+--------------+-------+-------+-------------------------
    NY |       ACCORD |  2695 | 12404 | [-74.235336, 41.808308]
    NY |         ACRA |   525 | 12405 | [-74.085723, 42.330367]
    NY |  ADAMS BASIN |   989 | 14410 | [-77.853905, 43.190644]
    NY | ADAMS CENTER |  2649 | 13606 |  [-76.00415, 43.863106]
    NY |      ADDISON |  4967 | 14801 |  [-77.266027, 42.09825]
    NY |   ADIRONDACK |   105 | 12808 | [-73.782486, 43.716479]
    NY |        AFTON |  2801 | 13730 | [-75.536604, 42.241737]
    NY |        AKRON |  7924 | 14001 | [-78.508365, 43.024944]
    NY |      ALABAMA |    68 | 14003 | [-78.385231, 43.071888]
    NY |       ALBANY |  2709 | 12207 | [-73.752327, 42.658133]
    NY |       ALBANY |  6927 | 12204 | [-73.735364, 42.684667]
    NY |       ALBANY |  9374 | 12210 |   [-73.76052, 42.65677]
    NY |       ALBANY | 10008 | 12209 | [-73.785385, 42.641665]
    NY |       ALBANY | 11097 | 12202 | [-73.764071, 42.641314]
    NY |       ALBANY | 17230 | 12206 | [-73.774406, 42.668326]

现在,当我添加另一个条件过滤语句来进行查询时:

SELECT * FROM test_view where state='NY' AND pop > 2000 ORDER BY 城市 ASC 限制 15;

我得到错误:

InvalidRequest:来自服务器的错误:code=2200 [无效查询] message="PRIMARY KEY 列 "pop" 不能像前面那样限制 “城市”列不受限制”

我希望能够保持上面表格/结果中条目的顺序,但也允许使用“pop”进行过滤。我将如何编辑我的物化视图语句来做到这一点?

【问题讨论】:

    标签: cassandra


    【解决方案1】:
    CREATE MATERIALIZED VIEW test_view AS SELECT state, city, zip, loc, pop FROM citylist WHERE state IS NOT NULL AND city IS NOT NULL AND zip IS NOT NULL AND pop IS NOT NULL
    PRIMARY KEY (state,pop,city,zip) WITH CLUSTERING ORDER BY (state ASC).
    

    创建键的顺序很重要 - 您不能在不限制复合键列表中的前一列的情况下限制一列(不允许过滤,这无论如何都不是一个好主意)

    【讨论】:

      【解决方案2】:

      如果您不打算同时使用州和城市进行查询,那么您可以将视图更改为如下所示的视图。

      CREATE MATERIALIZED VIEW test_view AS SELECT state, city, zip, loc, pop FROM citylist WHERE state IS NOT NULL AND city IS NOT NULL AND zip IS NOT NULL AND pop IS NOT NULL PRIMARY KEY (state,pop,city,zip) WITH CLUSTERING ORDER BY (pop ASC, city ASC)

      然后就可以这样查询了 SELECT * FROM test_view where state='NY' AND pop > 2000 ORDER BY pop, city ASC LIMIT 15;

      在上面的视图中,它不会保留一个州的城市顺序。这将是城市的人口顺序,而不是给定州的城市名称。如果您想在州内保留城市名称的排序,那么您必须在按人口过滤时指定城市和州。否则按人口过滤,但牺牲按城市名称排序。

      您收到错误的原因是因为您只能在指定分区键后按集群列的顺序查询。按聚类列过滤时,不能省略聚类键顺序中的前一列。

      【讨论】:

        猜你喜欢
        • 2017-11-23
        • 2018-04-13
        • 2019-03-03
        • 1970-01-01
        • 2023-03-26
        • 2017-03-26
        • 2018-07-04
        • 2013-12-06
        相关资源
        最近更新 更多