簡體   English   中英

在Cassandra表的任何列中使用IN

[英]Use IN in any column in a Cassandra Table

我希望能夠在Cassandra中以任何順序在任何列中使用IN

所以我有一張桌子:

CREATE TABLE test (a TEXT, b TEXT, c TEXT, PRIMARY KEY (a, b, c));

和這個數據:

INSERT INTO test (a, b, c) VALUES ('a1', 'b1', 'c1');
INSERT INTO test (a, b, c) VALUES ('a2', 'b2', 'c2');

該查詢有效:

SELECT * FROM test WHERE c IN ('c1', 'c2') AND b IN ('b1') ALLOW FILTERING;

但是,如果刪除b IN則會出現此錯誤:

SELECT * FROM test WHERE c IN ('c1', 'c2') ALLOW FILTERING;
InvalidRequest: Error from server: code=2200 [Invalid query] message="IN 
restrictions are not supported on indexed columns"

好像是否要在一列中使用IN ,我應該在以前的某些列中使用IN

有辦法避免這種情況嗎?

修改Schema是valid但我需要使用Cassandra並允許對任何列進行過濾(如果不需要過濾以為是一列,那么該列將沒有IN子句)。

謝謝閱讀。



PS:我知道您不應該使用ALLOW FILTERING請假設沒有其他方法。

編輯:似乎他們可能已解決此問題?: https//issues.apache.org/jira/browse/CASSANDRA-14344

卡桑德拉的主鍵有很多混亂之處。 為了回答您的問題,我認為您需要了解cassandra主鍵在內部如何工作。

當您創建具有多個字段的主鍵時,例如:

CREATE TABLE test (a TEXT, b TEXT, c TEXT, PRIMARY KEY (a, b, c));
  • “ a”將是分區鍵 ,您可以將其想象為一個散列,它將選擇要在其上分發數據的分區。
  • b和c將是聚類鍵 ,這些鍵將類似於數據的排序列表,並且c將嵌套在每個b值中,這意味着您必須提供b以便對c進行約束。

cassandra文檔指出,您只能在分區鍵的最后一列和集群鍵的最后一個上使用In子句,但請注意,您必須提供所有其他集群鍵。

因此,基本上沒有辦法在一張桌子上這樣做。

您應該考慮一下查詢靈活性與數據重復之間的權衡。 一種解決方案是在2個表中對數據進行非規范化,如下所示:

CREATE TABLE test1 (a TEXT, b TEXT, c TEXT, PRIMARY KEY (a, b));
CREATE TABLE test2 (a TEXT, b TEXT, c TEXT, PRIMARY KEY (c, a, b));

這樣,您將能夠根據用例查詢每個表。 以下查詢將起作用:

SELECT * FROM test2 WHERE c IN ('c1', 'c2');
SELECT * FROM test1 WHERE a IN ('a1', 'a2');
SELECT * FROM test1 WHERE b IN ('b1', 'b2') ALLOW FILTERING;

依此類推,我想你明白了。 但實際上,要盡力而為,以最大程度地減少允許過濾的使用。 並記住直接對分區鍵進行查詢將是最快的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM