Je veux insérer une seule ligne avec 50 000 colonnes dans Cassandra 1.2.8. Avant d'insérer, j'ai toutes les données pour toute la ligne prêt à aller (en mémoire):En utilisant Cassandra et CQL3, comment insérer une ligne large entière dans une seule requête?
+---------+------+------+------+------+-------+
| | 0 | 1 | 2 | ... | 49999 |
| row_id +------+------+------+------+-------+
| | text | text | text | ... | text |
+---------+------+------+------|------+-------+
Les noms de colonnes sont des nombres entiers, ce qui permet le découpage de pagination. Les valeurs de colonne sont une valeur à cet index particulier.
définition de la table CQL3:
create table results (
row_id text,
index int,
value text,
primary key (row_id, index)
)
with compact storage;
Comme je l'ai déjà row_id et toutes les paires nom 50 000/valeur en mémoire, je veux juste insérer une ligne unique dans Cassandra dans une seule requête/opération il est aussi vite que possible.
La seule chose que je peux sembler trouver est de faire exécuter les 50.000 heures suivantes:
INSERT INTO results (row_id, index, value) values (my_row_id, ?, ?);
la première ?
est est un compteur d'index (i
) et la seconde ?
est la valeur de texte pour stocker à emplacement i
.
Cela prend beaucoup de temps. Même lorsque nous mettons les INSERT ci-dessus dans un lot, cela prend beaucoup de temps.
Nous avons toutes les données dont nous avons besoin (la ligne complète) dans son intégralité, je suppose qu'il est très facile de simplement dire "ici, Cassandra, stocker ces données en une seule ligne dans une demande", par exemple :
//EXAMPLE-BUT-INVALID CQL3 SYNTAX:
insert into results (row_id, (index,value)) values
((0,text0), (1,text1), (2,text2), ..., (N,textN));
Cet exemple n'est pas possible via la syntaxe CQL3 actuelle, mais j'espère que cela illustre l'effet désiré: tout serait inséré comme une seule requête.
Est-il possible de faire cela dans CQL3 et le pilote Java DataStax? Si non, je suppose que je serai obligé d'utiliser Hector ou le pilote Astyanax et l'opération Thrift batch_insert
à la place?
Avez-vous essayé d'utiliser les listes/séries/cartes. Pour ce cas, il devrait faire l'affaire mais, comme Alex le dit, cela ferait un ajout intéressant à CQL3. – jorgebg
Oui, nous avons essayé, et il était assez rapide, mais il rompt complètement le modèle de données souhaitées: vous ne pouvez pas faire des requêtes de tranche sur les collections de CQL3. –