web-dev-qa-db-ja.com

JSON文字列をCassandra列に格納する効率的な方法?

カサンドラ初心者の質問。 REST呼び出しを使用して、ソーシャルネットワーキングサイトからデータを収集しています。そのため、データはJSON形式で返されます。

JSONは、テーブル内の列の1つにすぎません。 JSON文字列を保存するための「ベストプラクティス」とは何かを理解しようとしています。

最初にmapタイプを使用することを考えましたが、JSONにはストリング、数値タイプなどが混在しています。マップのキー/値にワイルドカードタイプを宣言できるようには見えません。 JSON文字列は非常に大きくなる可能性があり、おそらく10 KBを超えるサイズです。文字列として保存することもできますが、効率が悪いようです。これは一般的なタスクだと思いますので、これを行うための一般的なガイドラインがいくつかあると確信しています。

CassandraはJSONをネイティブにサポートしていますが、私が理解していることから、JSONマップ全体がデータベーススキーマと1-1に一致する場合に主に使用されます。多数の列があり、JSON文字列は単なる「ペイロード」のようなものです。JSON文字列をblobまたはtext?として保存する方が良いですか? Cassandraバージョンは2.1.5です。

ヒントをいただければ幸いです。前もって感謝します。

17
user2337270

Cassandra=ストレージエンジンでは、Cassandraは本質的にblobとしてテキストを保存します。そして、「ネイティブ」は、blobとテキストの間に大きな違いはありません。あなたが言うJSONサポートは、データモデルがJSONモデルと一致する場合にのみ使用され、Cassandra 2.2+。

テキストタイプとして保存します。データを送信する(または圧縮解除を処理する)ときにJSONデータを圧縮するために何も実装する必要はありません。 Cassandraのバイナリプロトコルは トランスポート圧縮 の実行をサポートしているため。また、テーブルが同じ圧縮アルゴリズムで data compressed を保存していることを確認してください(最も高速なアルゴリズムであるため、LZ4を使用することをお勧めします)。したがって、圧縮されたデータの保存を構成し、トランスポート圧縮を使用する場合は、自分で実装する必要さえありません。

どのクライアントドライバーを使用しているのかは言いませんでしたが、ここでは Datastax Javaクライアントドライバー のトランスポート圧縮のセットアップ方法に関するドキュメントがあります。

16
fromanator

JSONのクエリ方法によって異なります。 3つの可能な戦略があります:

  1. 文字列として保存
  2. 圧縮ブロブとして保存
  3. ブロブとして保存

オプション1には、コマンドラインでcqlshを使用してデータをクエリする場合、またはデータを直接ライブでデバッグする場合に、人間が読み取れるという利点があります。欠点は、このJSON列のサイズ(10k)です

オプション2には、テキスト要素の圧縮率がかなり高いため、JSONペイロードを小さく保つという利点があります。欠点は次のとおりです。クライアント側の圧縮/解凍の世話をする必要がありますb。人間が直接読むことはできません

オプション3には、オプション1(サイズ)と2(人間が読めない)の欠点があります

4
doanduyhai