【问题标题】:Storing binary blobs data in Cassandra Column family在 Cassandra Column 系列中存储二进制 blob 数据
【发布时间】:2013-09-20 19:38:22
【问题描述】:

我需要将二进制字节数据存储在我所有列的 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 客户端从 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 列。

【问题讨论】:

    标签: java cassandra binary-data astyanax


    【解决方案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));
    

    【讨论】:

    • 我将使用 Astyanax 客户端,所以我需要使用列族而不是 cql3。我不确定您为什么将 ByteType 用于 default_validation_class?
    • 还有为什么你在这里使用TimeUUIDType 作为比较器?我也更详细地更新了我的问题..
    • ByteType 用于验证类,因为您将数据存储为 byte[] 不是吗? TimeUUIDType 用于列排序。
    • 我将在这里给出我自己的列名,用于在 Cassandra 中存储二进制块。我相信,The comparator specifies the data type for the column name 对吧?在我的情况下,我需要在我的所有列中存储二进制 blob……那么为什么你在比较器中使用 TimeUUIDType 呢?这让我感到困惑?纠正我的理解如果我错了
    • 编辑了我的问题,我有例外,这会给你更好的主意..
    【解决方案2】:

    @Trekkie

    我现在了解您的要求:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      相关资源
      最近更新 更多