【问题标题】:How to add arbitrary columns to Cassandra using CQL with Datastax Java driver?如何使用带有 Datastax Java 驱动程序的 CQL 向 Cassandra 添加任意列?
【发布时间】:2013-10-07 04:05:42
【问题描述】:

我最近开始对CQL 产生浓厚的兴趣,因为我正在考虑使用 Datastax Java 驱动程序。以前,我使用 column family 而不是 table,我使用的是 Astyanax 驱动程序。我需要在这里澄清一些事情-

我在生产集群中使用下面的列族定义。而且我可以即时插入任意列(及其值),而无需实际修改列族架构。

create column family FAMILY_DATA
with key_validation_class = 'UTF8Type'
and comparator = 'UTF8Type'
and default_validation_class = 'BytesType'
and gc_grace = 86400;

但是在经历了这个post之后,它看起来像 - 每当我要插入一个新列时,我都需要更改架构,这不是我想要做的......因为我相信 CQL3 需要列元数据存在...

如果我使用 Datastax Java 驱动程序,是否还有其他方法,我仍然可以添加任意列及其特定值?

任何代码示例/示例都将帮助我更好地理解..谢谢..

【问题讨论】:

  • Cassandra 2.0 不支持离开 Astayanax 的任何充分理由吗? (问这个是因为我也打算从 Hector 迁移到 Astayanax 或 DS java 驱动程序,但是从 thrift 完全迁移到 CQL,看起来并不简单

标签: java cassandra cql cql3 datastax-java-driver


【解决方案1】:

我相信 CQL 你可以使用collections 解决这个问题。

您可以将字段的数据类型定义为映射,然后将任意数量的键值对插入到映射中,这应该与传统 Thrift 中的动态列一样。

类似:

CREATE TABLE data ( data_id int PRIMARY KEY, data_time long, data_values map );
INSERT INTO data (data_id, data_time, data_values) VALUES (1, 21341324, {'sum': 2134, 'avg': 44.5 });

Here 是更多信息。

此外,您还可以找到 CQL3 类型与 DataStax 驱动程序使用的 Java 类型之间的映射here

【讨论】:

  • 谢谢 Nikhil.. 地图的数据类型是什么?我们可以每次在映射中插入字符串作为键名和字节类型作为值名吗?
  • @TechGeeky 绝对是。您可以在create table 定义中指定映射的键/值类型。例如:create table data( data_id int primary key, data_time long, data_values map<ascii, blob> );。当您将数据插入到所述表中时,您将不得不使用匹配的 java.util.Map 类型。我自己没有测试过,但我相信它应该可以正常工作。有关详细信息,请参阅CQL reference
【解决方案2】:

如果您为该表启用紧凑存储,它将向后兼容 thrift 和 CQL 2.0,这两者都允许您输入动态列名。

使用这种方法,您可以拥有任意数量的任意名称的列。主键由两部分组成,第一个元素是 row_key,其余元素组合为一个集合形成单个列名。

查看推文示例here

尽管您已经说过这已经投入生产,但可能无法使用现有数据更改表以使用紧凑型存储。

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 2016-11-14
    • 2017-05-25
    • 2014-03-31
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2018-02-15
    • 2018-09-26
    相关资源
    最近更新 更多