2012-12-07 5 views
1

J'ai toujours lu que Cassandra est bon si votre application change fréquemment et que des fonctionnalités sont ajoutées fréquemment. Cela a du sens, puisque vous n'avez aucun schéma fixe, vous pouvez ajouter des colonnes aux lignes pour répondre à vos besoins, au lieu d'exécuter une requête ALTER TABLE qui peut geler votre base de données pendant des heures pour les très grandes tables.Comment remplir une famille de colonnes Cassandra à partir des colonnes d'une autre personne?

Cependant, j'ai un problème hypotétique que je ne suis pas capable de résoudre. Disons que j'ai:

CREATE COLUMN FAMILY Students 
    with comparator='CompositeType(UTF8Type,UTF8Type), 
    and key_validation_class=UUIDType; 

Chaque élève a une colonne générique (vous savez, meta: nom d'utilisateur, meta: mot de passe, meta: nom de famille, etc.), ainsi que chaque étudiant peut suivre des cours N. Cette relation N-N est résolue en utilisant la dénormalisation, en ajoutant N colonnes à chaque étudiant (cours: ID1, cours: ID2). De l'autre côté, je peux avoir un cours CF, où chaque ligne contient tous les UUID suivants.

Je peux donc demander "quels cours sont suivis par XXX" et "quels étudiants suivent le cours YYY".

Le problème est le suivant: que se passe-t-il si je n'ai pas créé la deuxième famille de colonnes? Peut-être qu'au moment de la création de la demande, il n'était pas obligatoire de faire suivre aux étudiants un cours spécifique.

Ceci est un exemple simple, mais je crois que c'est assez commun. "Avec Cassandra, vous planifiez les CF en termes de requêtes au lieu de relations". J'ai besoin de cette requête maintenant, alors qu'au début, ce n'était pas nécessaire. Étant donné une table d'étudiants avec des milliers d'entrées, comment remplissez-vous les cours CF? Est-ce un travail pour Hadoop, Pig ou Hive (je n'ai jamais touché à l'un d'entre eux, juste deviner).

+0

duplicata possible de [Quel est le moyen le plus rapide de copier la famille Colonne dans Cassandra?] (Http://stackoverflow.com/questions/12086395/what-is-the-fastest-way-to-copy-column-family -in-cassandra) –

+0

@ChrisGerken: Je ne pense pas. Il ne veut pas copier des données; il veut générer de nouvelles données basées sur des données existantes. Cela nécessite des outils différents. –

+0

Eh bien, le fait important, c'est qu'il ya un moyen de faire ce travail assez rapidement, en parallèle à travers Pig et que l'opération ne sera pas DOS l'application derrière ... –

Répondre

3

Pig (qui utilise l'intégration Hadoop) est en fait parfait pour ce type de travail, car vous pouvez non seulement lire mais aussi écrire des données dans Cassandra en utilisant CassandraStorage. Il vous donne la capacité de traitement parallèle pour faire le travail avec un minimum de temps et de frais généraux. Sinon, l'alternative est d'écrire vous-même quelque chose pour faire l'extraction, puis écrire la nouvelle CF.

Voici un exemple de porc qui calcule la moyenne d'un ensemble de données dans un CF et les sorties à l'autre:

rows = LOAD 'cassandra://HadoopTest/TestInput' USING CassandraStorage() AS (key:bytearray,cols:bag{col:tuple(name:chararray,value)}); 
columns = FOREACH rows GENERATE flatten(cols) AS (name,value); 
grouped = GROUP columns BY name; 
vals = FOREACH grouped GENERATE group, columns.value AS values; 
avgs = FOREACH vals GENERATE group, 'Pig_Average' AS name, (long)SUM(values.value)/COUNT(values.value) AS average;  
cass_group = GROUP avgs BY group; 
cass_out = FOREACH cass_group GENERATE group, avgs.(name, average); 
STORE cass_out INTO 'cassandra://HadoopTest/TestOutput' USING CassandraStorage(); 
+0

Oui - la réponse est: écrire le code de l'application à faire il. – Sarge

+2

@Sarge: Eh bien, si vous appelez Pig "code de l'application" alors je suppose que oui. Je pense plutôt à un outil de script rapide. –

+0

Eh bien, la réponse évidente était "lire toutes les lignes, réécrire à la nouvelle table".Cependant j'étais curieux de voir Hadoop en action pour ce genre de travail. Aussi, lire toutes les lignes n'est pas si efficace dans Cassandra ... –

0

Si vous utilisez le fichier cassandra existant, vous devez décompresser les données. Puisque les fichiers NOSQL sont unidirectionnels, cela pourrait prendre beaucoup de temps à Cassandra. Les données doivent être triées dans l'ordre inverse du premier fichier. Franchement, je crois que vous devrez revenir aux données d'origine qui ont été utilisées pour remplir le premier fichier et remplir ce nouveau fichier.

Questions connexes