1

すべての列の Cassandra 列ファミリーにバイナリ バイト データを格納する必要があります。以下は、バイナリバイトデータを取得するコードです。行キーは文字列になりますが、すべての列にバイナリ BLOB データを格納する必要があります。

GenericDatumWriter<GenericRecord> writer = new GenericDatumWriter<GenericRecord>(schema); 
ByteArrayOutputStream os = new ByteArrayOutputStream(); 
Encoder e = EncoderFactory.get().binaryEncoder(os, null); 
writer.write(record, e); 
e.flush(); 
byte[] byteData = os.toByteArray(); 
os.close();

// write byteData in Cassandra.

上記のユース ケースで Cassandra カラム ファミリーを作成する正しい方法がわかりません。以下は私が作成した列ファミリーですが、これが上記のユースケースに対して正しい方法であるかどうかわかりませんか?

create column family TESTING
with key_validation_class = 'UTF8Type'
and comparator = 'UTF8Type'
and default_validation_class = 'UTF8Type'
and gc_grace = 86400
and column_metadata = [ {column_name : 'lmd', validation_class : DateType}];

アップデート:-

Astyanax Client を使用して、Cassandra からデータを取得します。私のユースケースは単純です。

上記の Cassandra 列ファミリーのすべての列は、バイナリ BLOB データのみを格納します。

この列ファミリーはどうですか? 正しく見えますか?

create column family TESTING
with key_validation_class = 'UTF8Type'
and comparator = 'TimeUUIDType'
and default_validation_class = 'ByteType'
and gc_grace = 86400
and column_metadata = [ {column_name : 'lmd', validation_class : DateType}];

上記の列ファミリーを作成しようとしたときに、この例外が発生しました-

[default@profileks] create column family TESTING
...     with key_validation_class = 'UTF8Type'
...     and comparator = 'TimeUUIDType'
...     and default_validation_class = 'ByteType'
...     and gc_grace = 86400
...     and column_metadata = [ {column_name : 'lmd', validation_class : DateType}];

java.lang.RuntimeException: org.apache.cassandra.db.marshal.MarshalException: Unknown timeuuid representation: lmd

userId を rowKey として保存し、次に column-name にバイナリ BLOB データを保存し、最後に lmd を DateType 列として保存します。

4

2 に答える 2

1

@トレキー

Thrift クライアントを使用している場合:

create column family TESTING
with key_validation_class = 'UTF8Type'
and comparator = 'TimeUUIDType'
and default_validation_class = 'ByteType'

*default_validation_class* はblob を格納するByteTypeです。

データへのアクセス方法を指定しなかったため、列の自然な順序付けにTimeUUIDTypeを使用できます

CQL3 を使用している場合:

CREATE TABLE TESTING(
  partition_key text, //corresponds to row key
  column_name timeuuid,
  data blob,
  PRIMARY KEY(partition_key));
于 2013-09-19T18:13:57.900 に答える
0

@トレキー

私はあなたの要件を理解しました:

  1. 行キー = テキスト
  2. 列名 = 格納用のバイト
  3. 値 = なし

最初は、バイナリ データを column nameではなくcolumn valueに格納すると想定していました。

列名にデータを格納する場合は、列名に 64K を超えるデータを格納できないため、十分に注意してください。ブロブが 64K を超えることはありませんか?

http://wiki.apache.org/cassandra/FAQ#max_key_size

于 2013-09-20T11:38:22.230 に答える