[英]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));
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.