1

我需要将二进制字节数据存储在我所有列的 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 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,然后我的列名将存储二进制 blob 数据,最后将 lmd 作为 DateType 列。

4

2 回答 2

1

@Trekkie

如果您使用 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

@Trekkie

我现在了解您的要求:

  1. 行键 = 文本
  2. 列名 = 用于存储的字节
  3. 值 = 无

一开始,我假设您将二进制数据存储在value列中,而不是列name中。

如果您将数据存储在列名中,请非常小心,因为您不能在列名中存储超过 64K 的数据。你确定你的 blob 永远不会超过 64K 吗?

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

于 2013-09-20T11:38:22.230 回答