我需要在我的所有列中的Cassandra列族中存储二进制字节数据。下面是我将获得二进制字节数据的代码。我的rowKey将是String,但我的所有列都必须存储二进制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 Column Family中的所有列都只存储二进制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,它将存储binary-blobs数据,最后将lmd存储为DateType列。
答案 0 :(得分:1)
@Trekkie
如果你正在使用Thrift客户端:
create column family TESTING
with key_validation_class = 'UTF8Type'
and comparator = 'TimeUUIDType'
and default_validation_class = 'ByteType'
* default_validation_class *为 ByteType 以存储blob。
由于您未指定访问数据的方式,因此可以使用 TimeUUIDType 进行列的自然排序
如果您使用的是CQL3:
CREATE TABLE TESTING(
partition_key text, //corresponds to row key
column_name timeuuid,
data blob,
PRIMARY KEY(partition_key));
答案 1 :(得分:0)
@Trekkie
我现在明白你的要求:
最初,我假设您将二进制数据存储在值列中,而不是列名称。
如果以列名存储数据,请务必小心,因为您不能在列名中存储超过64K的数据。你确定blob永远不会超过64K吗?