我需要将二进制字节数据存储在我所有列的 Cassandra 列系列中。下面是我将获取二进制字节数据的代码。我的 rowKey 将是字符串,但我的所有列都必须存储二进制 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客户端从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,然后是我的列名,它将存储二进制 blobs 数据,最后将 lmd 存储为 DateType 列。
> @Trekkie
如果您使用的是节俭客户端:
create column family TESTING
with key_validation_class = 'UTF8Type'
and comparator = 'TimeUUIDType'
and default_validation_class = 'ByteType'
*default_validation_class* 是用于存储 blob 的字节类型。
由于您没有指定访问数据的方式,因此可以使用 TimeUUIDType 对列进行自然排序
如果您使用的是 CQL3:
CREATE TABLE TESTING(
partition_key text, //corresponds to row key
column_name timeuuid,
data blob,
PRIMARY KEY(partition_key));
> @Trekkie
我现在明白您的要求:
- 行键 = 文本
- 列名 = 用于存储的字节
- 值 = 无
一开始,我假设您将二进制数据存储在列值中,而不是列名中。
如果将数据存储在列名中,请非常小心,因为不能在列名中存储超过 64K 的数据。您确定您的 blob 永远不会超过 64K 吗?
http://wiki.apache.org/cassandra/FAQ#max_key_size