2

このようなデータがあります

  {super-row-key1 [{ts1 {version-ts1 value, version-ts2 value}}
                   {ts2 {version-ts1 value}}]
   super-row-key2 ...}

これらのキーと値は次のようになります

{"4447c9a6-9912-44d7-a6b5-cef40735f92c:2011-06"
 [{1291180500000 {1351709255098 -0.008084167000000001}}
  {1291184100000 {1351709255098 -0.004395833}}
  {1291185000000 {1351709255098 -0.003075}}]
 ...}

したがって、ClojureWerks Cassandra カスケード タップがすべての行にわたる操作を既にサポートしているかどうかを調べようとしています。ご覧のとおり、スーパー行キー、スーパー行、およびスーパー列がすべて生成されます (uuid、日付、タイムスタンプなど)。私が見た例とコードでは、列名、列フィールド名、キー列名、およびフィールド マッピングを識別する固定名を事前に指定する必要があると思われます。

MapReduce に対する Cassandra のサポートの Hadoop レベルでは、Cassandra は特定の列ファミリーからのすべてのデータ行のフェッチをサポートしているようです。ドキュメントから:

「Cassandra の行または行フラグメント (つまり、キーのペア + 列の SortedMap) は、各行からフェッチする列を記述する SlicePredicate で指定されているように、ジョブで処理するために Map タスクに入力されます。」

したがって、低レベルでは間違いなく可能であるように見えますが、Cascading レベルで私がやろうとしていることをどのように達成するかは不明です。

これには、既存のタップのバリアントを適応または作成する必要がありますか、それとも既存のタップで何らかの方法で行うことができますか?

4

1 に答える 1

3

ロバートが参照していると思います: https://github.com/ifesdjeen/cascading-cassandra

pingles/cascading.cassandra を Cascalog で動作させようとしましたが、成功せず、すべての依存関係があるため、すべてのインターフェイスを変更する必要がありました。そこで、私は自分のことを書くことにしました (常に最良のアイデアであるとは限りません)。

さて、答えに:

あなたに正確に答える方法を理解するのに予想よりも少し時間がかかりましたが、良いニュースをお届けします:)

まず、タップにワイド行のサポートを含める予定はありませんでしたが、現在のバージョンでも機能することがわかりました。残念ながら、Cassaforte (https://github.com/clojurewerkz/cassaforte、使用している cassandra ドライバーは、プリミティブ型ヒントのバグにより Clojure 1.4 に依存しているため、まだ例をプッシュすることはできません: http://dev .clojure.org/jira/browse/CLJ-852私の間違いでなければ、Midje にはハード バージョンが設定されているため、1.4 をサポートしていないため、独自のドライバーの古いバージョンを使用せざるを得ません)。

幅の広い行を含めない理由は、cassandra チーム自身がそれらの使用を思いとどまらせ、代わりに複合列を使用することを推奨しているためです。これは、より適切な方法で読み取ることができ、部分的なデータを取得するためにスーパー列全体をフェッチする必要がないためです。ただし、特に以前に作成されたアプリがあった場合は、必ずしも簡単ではないことを認識しています。

次は、

名前を指定する必要があるのは正しいです。どういうわけか、生成された列名を予測できませんでした。

すべての列をフェッチするには、SlicePredicate を使用し、空のバイト バッファーと、それに渡す SliceRange のスライス開始とスライス終了を指定する必要があります。したがって、(.setColumn_names) の代わりに SliceRange (.setSlice_range) を設定できます。まったく同じことになります。CasssandraScheme.java https://github.com/ifesdjeen/cascading-cassandra/blob/masterでその変更を行うことができます。 /src/main/java/com/clojurewerkz/cascading/cassandra/Cas​​sandraScheme.java#L247私たちのタップに固執することにした場合。私がしたいことは、列名が指定されていない場合、それらすべてを取得することです。

必要になるもう 1 つの変更は、値の逆シリアル化です。おそらくここで、幅の広い行を処理する方法についてより良い感じが得られます。本質的に、次のような応答が得られます。

キー / {java.nio.HeapByteBuffer[pos=65 lim=70cap=93]=org.apache.cassandra.db.Column@478bb374}

したがって、フォーマットはほとんど同じになります。ここでは、キーを逆シリアル化し、列をタプルに変換するだけです。列内のキーと値のペアの量が異なる場合は、(おそらく) null で埋める必要があります。そうしないと、理解/デバッグが困難になる可能性があります。

繰り返しますが、out tap を使用しないことにした場合は、Cassaforte beta10 スナップショットにアップグレードし、(少なくとも最初のテストでは) project.clj から midje を削除し、それに関連するすべてをコメントアウトする必要があります。

必要に応じて、cassaforte コードを使用して小さなデータセットにデータを入力できます (私は通常、いくつかのレコードを使用します): https://github.com/clojurewerkz/cassaforte/blob/master/test/clojurewerkz/cassaforte/thrift/core_test .clj#L26

于 2012-11-20T07:32:26.600 に答える