web-dev-qa-db-fra.com

Un moyen efficace de stocker une chaîne JSON dans une colonne Cassandra?

Cassandra newbie question. Je collecte des données à partir d'un site de réseautage social à l'aide d'appels REST. Je me retrouve donc avec les données qui reviennent au format JSON.

Le JSON n'est qu'une des colonnes de ma table. J'essaie de comprendre quelle est la "meilleure pratique" pour stocker la chaîne JSON.

J'ai d'abord pensé à utiliser le type map, mais le JSON contient un mélange de chaînes, de types numériques, etc. Il ne semble pas que je puisse déclarer des types génériques pour la clé/valeur de la carte. La chaîne JSON peut être assez grande, probablement supérieure à 10 Ko. Je pourrais potentiellement le stocker sous forme de chaîne, mais il semble que ce serait inefficace. Je suppose que c'est une tâche courante, donc je suis sûr qu'il existe des directives générales sur la façon de procéder.

Je sais Cassandra a un support natif pour JSON, mais d'après ce que je comprends, c'est surtout utilisé lorsque la carte JSON entière correspond à 1-1 avec le schéma de base de données. Ce n'est pas le cas pour moi. Le schéma a un tas de colonnes et la chaîne JSON est juste une sorte de "charge utile". Est-il préférable de stocker la chaîne JSON comme blob ou text? BTW, le Cassandra version est 2.1.5.

Tous les indices appréciés. Merci d'avance.

17
user2337270

Dans le moteur de stockage Cassandra il n'y a vraiment pas de grande différence entre un blob et un texte, car Cassandra stocke le texte comme des blobs essentiellement. Et oui, le "natif" La prise en charge JSON dont vous parlez ne concerne que lorsque votre modèle de données correspond à votre modèle JSON, et uniquement dans Cassandra 2.2+.

Je le stockerais en tant que type de texte, et vous ne devriez pas avoir à implémenter quoi que ce soit pour compresser vos données JSON lors de l'envoi des données (ou gérer la décompression). Étant donné que le protocole binaire de Cassandra prend en charge l'exécution de compression de transport . Assurez-vous également que votre table stocke le données compressées avec le même algorithme de compression (je suggère d'utiliser LZ4 car c'est l'algorithme le plus rapide implémenté) pour économiser sur la compression pour chaque demande de lecture. Ainsi, si vous configurez le stockage des données compressées et utilisez la compression de transport, vous n'avez même pas besoin de l'implémenter vous-même.

Vous n'avez pas dit quel pilote client vous utilisez, mais voici la documentation sur la façon de configurer la compression de transport pour Datastax Java Client Driver .

16
fromanator

Cela dépend de la façon dont vous souhaitez interroger votre JSON. Il existe 3 stratégies possibles:

  1. Stocker sous forme de chaîne
  2. Stocker en tant qu'objet blob compressé
  3. Stocker comme un blob

L'option 1 a l'avantage d'être lisible par l'homme lorsque vous interrogez vos données sur la ligne de commande avec cqlsh ou si vous souhaitez déboguer des données directement en direct. L'inconvénient est la taille de cette colonne JSON (10k)

L'option 2 a l'avantage de garder la charge utile JSON petite car les éléments de texte ont une ration de compression assez décente. Les inconvénients sont: a. vous devez prendre soin de la compression/décompression côté client et b. ce n'est pas lisible par l'homme directement

L'option 3 présente des inconvénients de l'option 1 (taille) et 2 (non lisible par l'homme)

4
doanduyhai