2017-03-02 2 views
0

J'ai une table cassandra qui ressemble à ce qui suit:cassandra - comment mettre à jour la colonne décimale en ajoutant à la valeur existante

create table position_snapshots_by_security(
securityCode text, 
portfolioId  int, 
lastUpdated  date, 
units   decimal, 
primary key((securityCode), portfolioId) 
) 

Et je voudrais quelque chose comme ceci:

update position_snapshots_by_security 
    set units = units + 12.3, 
       lastUpdated = '2017-03-02' 
    where securityCode = 'SPY' 
    and portfolioId = '5dfxa2561db9' 

Mais ça ne marche pas.

Est-il possible de faire ce genre d'opération à Cassandra? J'utilise la version 3.10, la dernière.

Merci!

J

Répondre

2

Ce n'est pas possible Cassandra (toute version) car elle nécessiterait un modèle de lecture avant écriture (anti).

Vous pouvez essayer le counter columns s'ils répondent à vos besoins. Vous pouvez également essayer de mettre en cache/compter au niveau de l'application.

Vous devez effectuer une lecture au niveau de l'application sinon, ce qui réduit les performances de votre cluster.

2

Cassandra ne fait pas une lecture avant une écriture (sauf si vous utilisez Lightweight Transactions) donc elle ne supporte pas les opérations comme celle que vous essayez de faire qui s'appuient sur la valeur existante d'une colonne. Cela dit, il est toujours possible de le faire dans votre code d'application avec Cassandra. Si vous avez plusieurs écrivains qui mettent éventuellement à jour cette valeur, vous voudrez utiliser le LWT susmentionné pour vous assurer que la valeur est exacte et que plusieurs auteurs ne se «marchent pas» entre eux. En fait, les étapes que vous aurez envie de suivre pour le faire sont:

  1. Lire la valeur actuelle de Cassandra en utilisant un SELECT. Assurez-vous que vous faites la lecture avec un niveau de cohérence de SERIAL ou LOCAL_SERIAL si vous utilisez des LWT.
  2. Effectuez le calcul à ajouter à la valeur actuelle dans votre code d'application.
  3. Mettez à jour la valeur dans Cassandra avec une instruction UPDATE. Si vous utilisez un LWT, vous voudrez faire UPDATE ... IF value = previous_value_you_read.

Si vous utilisez TSDL, le UPDATE sera rejeté si la valeur précédente que vous avez lu changé pendant que vous faites le calcul. (Et vous pouvez réessayer toute la série d'étapes.) Gardez à l'esprit que les LWT sont des opérations coûteuses, en particulier si les clés que vous lisez/mettez à jour sont fortement contestées.

Espérons que ça aide!