2016-03-13 3 views
0

tout le monde: DBesoin d'interroger dans une colonne (ou collection) dans Cassandra

Je travaille avec Cassandra (version Datastax) et j'ai un problème.

Je veux modéliser une colonne qui va (toujours) changer.

C'est très difficile, car je ne peux pas créer une famille de colonnes avec des colonnes 1,2,3,4.10. Parce que demain peut probablement changer.

Je pense que dans les collections, mais je dois interroger dans ceux-ci. Je veux dire, j'ai besoin de requête dans cette information chaque seconde.

Ex: avec la carte:

<'col1':'val1','col2':'val2'> 

Je dois interroger comme ceci:

SELECT * FROM example WHERE 'col1' = 'val1' AND 'col2' = 'val2'; 

Je ne sais pas comment faire cela et il est extrêmement nécessaire pour ce que je veux faire.

Même, je lis que vous pouvez créer une colonne (texte) et mettre en œuvre un type de format:

colum1 = 'val1\x01val2\x01' 

Mais cela ne résout pas ce que je veux faire, parce que je ne peux pas la requête sur ces champs (ou ne sais pas comment)

S'il vous plaît, pouvez-vous m'aider à modéliser quelque chose comme ça?

Je ne peux pas utiliser une collection car (selon ce que je lis) est lente.

PD: désolé si mon anglais est mauvais :(mais je vous remercie

Répondre

0

Vous pouvez créer un tableau comme celui

CREATE TABLE dynamic_columns 
    partitionKey bigint, 
    column_name text, 
    column_value_text text, 
    column_value_boolean boolean, 
    column_value_bigint bigint, 
    column_value_uuid uuid, 
    column_value_timestamp timestamp, 
    .... 
    PRIMARY KEY((partitionKey), column_name) 
); 

Le PartitionKey est ici pour indiquer sur quelle machine (s) vos données seront être stockés dans le cluster

la colonne en cluster column_name stocke l'étiquette de votre colonne dynamique. Ensuite, nous avons une liste de normale colonnes, une pour chaque type de données (bigint, UUID, timestamp ....)

Prenons et exemple:

INSERT INTO dynamic_columns(partitionKey, column_name, column_value_text) 
VALUES(1, 'firstname', 'John DOE'); 

INSERT INTO dynamic_columns(partitionKey, column_name, column_value_boolean) 
VALUES(1, 'validity_state', true); 

INSERT INTO dynamic_columns(partitionKey, column_name, column_value_timestamp) 
VALUES(1, 'validity_date', '2016-03-13 12:00:00+0000'); 

L'idée est que nous définissons une liste de column_value, un pour chaque type existant dans Cassandra mais nous insérons seulement des données dans la colonne de type appropriée, comme les exemples ci-dessus.

Pour l'interrogation, vous devez créer un index sur chaque colonne de type. Exemple:

CREATE INDEX ON dynamic_columns(column_value_boolean); 
CREATE INDEX ON dynamic_columns(column_value_text); 
CREATE INDEX ON dynamic_columns(column_value_boolean); 
.... 

Si vous pouvez passer à Cassandra 3.4, il y a une meilleure mise en œuvre de l'index secondaire appelé SASI, voici la syntaxe pour la création d'index:

// All data types EXCEPT text 
CREATE CUSTOM INDEX ON types(column_value_boolean) 
USING 'org.apache.cassandra.index.sasi.SASIIndex' 
WITH OPTIONS = {'mode': 'SPARSE'}; 

// Text data type 
CREATE CUSTOM INDEX ON types(column_value_text) 
USING 'org.apache.cassandra.index.sasi.SASIIndex' 
WITH OPTIONS = { 
    'mode': 'PREFIX', 
    'analyzer_class' : 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 
    'case_sensitive': 'false' 
}; 

Ensuite, vous pouvez interroger vos colonnes facilement:

//Give me col1 where value = 'val1' 
SELECT * FROM dynamic_columns 
WHERE partitionKey=1 
AND column_name='col1' 
AND column_value_text='val1'; 

//Give me 'validity_state' = true 
SELECT * FROM dynamic_columns 
WHERE partitionKey=1 
AND column_name='validity_state' 
AND column_value_boolean=true; 

Remarque: vous devez toujours fournir partitionKey valeur dans votre SELECT sinon Cassandra va effectuer un balayage complet de cluster dans le pire des cas et tuer votre performance. Avec l'SASI index depuis Cassandra 3.4, ce problème est moins critique, mais il est encore fortement recommandé de fournir PartitionKey lors de l'utilisation index secondaire

Pour plus d'informations sur l'importance de la clé de partition, lisez ceci: http://www.planetcassandra.org/blog/the-most-important-thing-to-know-in-cassandra-data-modeling-the-primary-key/

+0

Oh, merci beaucoup. Est-ce un très bon modèle. –