在Cassandra中动态添加列

7

我有一个 CQL3 表格,格式如下:

create table product_info
(
 key text,
 value text,
 Primary key (key)
);

这是一个垂直表格。因此,我可以插入带有(键,值)对的新行。

示例数据:

产品信息

  key                |     value       
  -------------------------------------------
  product_name       |   sample_product   
  quantity           |   2
  manufacture        |   sample_manufacturer   
  ....                   ....

但我需要的是一个水平表格,我可以在不更改表格的情况下动态添加列。
产品信息
    product_name     |   quantity   |  manufacture           |  ....
   ------------------------------------------------------------------------------    
    sample_product   |    2         |  sample_manufacturer   |  ....

我需要像上面的表格一样的结构,需要在运行时不断添加列。

CQL3提供了动态添加列的选项,但在此之前我们需要修改表。

我想知道是否有其他方法允许这样做。

我发现使用thrift api是可能的,但由于thrift不再受支持,因此不能使用它。

是否有其他支持此功能的API,例如hector或其他任何内容?

我查看了类似的stackoverflow帖子,但没有找到更好的解决方案。


我的第一反应是:你做错了™。Cassandra已经是一个键/值存储器,能够处理这种情况。本质上,你正在模拟另一个键/值存储器中的键/值存储器,这在我看来没有多大意义。因此,第二种方法正是你应该采取的方法,如果你正确使用Cassandra,它也能够实现。第一种方法只是让简单的事情变得过于复杂。 - JensG
2个回答

5
CREATE TABLE product_info(
    product_name text,
    key text,
    value text,
    PRIMARY KEY (product_name, key)
);

现在您可以插入多达2B个键值对,因为键现在是聚簇列。

INSERT INTO product_info (product_name, key, value) 
    VALUES ('iPhone 6', 'quantity', '2');

INSERT INTO product_info (product_name, key, value) 
    VALUES ('iPhone 6', 'manufacturer', 'Apple');

INSERT INTO product_info (product_name, key, value) 
    VALUES ('iPhone 6', 'quantity', '2');

INSERT INTO product_info (product_name, key, value) 
    VALUES ('iPhone 6', 'another column name', 'another column value');

然而,由于您没有指定查询访问模式,因此该数据模型可能完全不适合您的应用程序(或者是可行的)。


答案对于正常情况看起来不错。但结果表仍然是竖直的。我需要一个水平扩展的表格。就像每个新值必须作为列添加,而不是作为行。 - Sujith PS
1
嗨,Sunjith,C* 是宽列。 "行" 只是基础物理宽列的 CQL 抽象。如果您在 cassandra-cli 中查看数据,您将看到一个单个分区键,然后是一列接着一列的列。 CQL 中的 "垂直行" 实际上是物理宽列。CQL 不过是一种抽象,将物理宽列显示为垂直行(类似但不同于 RDBMS 中的 CTE)。 - Akbar Ahmed
@AkbarAhmed 我认为你的回答与他的问题无关。在他的示例中,他不关心数据实际上将如何存储在磁盘上。如果您从这样的CF中进行选择,您仍将看到一个垂直表格。他正在询问如何向一行添加列。例如,他可能希望将固件版本作为新列添加到没有值的行中。在这种示例中,如果您选择这样的CF,则会获得宽行数据。据我所知,使用CQL3已经不再可能。 - I4004
@I4004 CQL3仍然具有宽列。存储与thrift完全相同,唯一的区别在于数据的投影方式。CQL在宽列数据上投影关系结构。请参见:http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows - Akbar Ahmed
@AkbarAhmed,是的,我看过这篇文章。但是你知道,表的结构是严格定义的,你不能轻易地向行中添加任意列。实际上,如果使用聚簇,数据将以不同的方式存储,但是您不能再添加新列,必须更改整个CF才能实现。让我们考虑一个例子:在我的CF中,我有2个列 - PK 'id'和'weight'。所以现在,我不能再插入一个未知列“height”的行了,CQL不允许这样做。这意味着,在Thrift理解下,我无法创建Wide rows。 - I4004

1

是的,我确实浏览了地图。但我认为这不是最好的解决方案。因为它不符合我的期望。 - Sujith PS
你的期望是什么?你可以随时添加带有值的新键,并且可以更新键的值。在内部,Cassandra维护映射,因此您可以按照映射抽象思考。 - ashic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接