Penso che questo errore sia dovuto al modello di archiviazione sottostante di Cassandra. Quando mi interrogo tuo test1
tavolo entro CQLSH (con i miei dati di test), questo è quello che vedo:
[email protected]:stackoverflow> SELECT * FROM test1;
test_date | test_id | caption | tags
-----------+---------+-----------+-------------------------
2022015 | 1 | blah blah | {'one', 'three', 'two'}
2022015 | 2 | blah blah | {'one', 'three', 'two'}
(2 rows)
Questo punto di vista dà un'interpretazione fuorviante di come i dati vengono memorizzati in realtà. Questo è quello che sembra quando interrogo stesso tavolo dall'interno cassandra-cli:
[[email protected]] list test1;
Using default limit of 100
Using default cell limit of 100
-------------------
RowKey: 2022015
=> (name=1:, value=, timestamp=1422895168730184)
=> (name=1:caption, value=626c616820626c6168, timestamp=1422895168730184)
=> (name=1:tags:6f6e65, value=, timestamp=1422895168730184)
=> (name=1:tags:7468726565, value=, timestamp=1422895168730184)
=> (name=1:tags:74776f, value=, timestamp=1422895168730184)
=> (name=2:, value=, timestamp=1422895161891116)
=> (name=2:caption, value=626c616820626c6168, timestamp=1422895161891116)
=> (name=2:tags:6f6e65, value=, timestamp=1422895161891116)
=> (name=2:tags:7468726565, value=, timestamp=1422895161891116)
=> (name=2:tags:74776f, value=, timestamp=1422895161891116)
1 Row Returned.
Ciò suggerisce che i valori Collection (set) sono memorizzati come tasti di colonna aggiuntiva. Una restrizione sull'uso della relazione IN
è che deve operare sull'ultima chiave (partizionamento o clustering) di una chiave primaria. Quindi immagino che questa sia una limitazione basata su come Cassandra memorizza i dati della collezione "sotto il cofano".
E solo un avviso, ma l'utilizzo di IN
per le query a livello di produzione non è consigliato. Alcuni sono addirittura arrivati alla lista degli anti-pattern di Cassandra. La mia risposta a questa domanda (Is the IN relation in Cassandra bad for queries?) spiega perché le query IN
non sono ottimali.
EDIT
Solo per vedere, ho provato lo schema con un elenco invece di un set per vedere se che ha fatto alcuna differenza. Non funzionava ancora, ma dall'interno del cassandra-cli sembrava aggiungere un ulteriore identificatore UUID alla chiave e memorizzare il valore attuale come valore della colonna. Che è diverso da come è stato trattato un set ... questo deve essere il modo in cui i set sono limitati a valori univoci.
di solito non è una buona idea usare nella dichiarazione con la chiave di partizione. – k0ner