すべての列の 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 列として保存します。