Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在cassandra中动态添加列_Java_Cassandra_Thrift_Hector_Cassandra Cli - Fatal编程技术网

Java 在cassandra中动态添加列

Java 在cassandra中动态添加列,java,cassandra,thrift,hector,cassandra-cli,Java,Cassandra,Thrift,Hector,Cassandra Cli,我在CQL3有一张这样的桌子 create table product_info ( key text, value text, Primary key (key) ); 这是一张垂直的桌子。因为我可以用(键,值)对插入新行 样本数据将为: 产品信息 key | value ------------------------------------------- product_name | sample_pr

我在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   |  ....
但我需要的是一个水平表,在这里我可以动态添加列,而无需更改表

产品信息

  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或其他支持此功能的API

我确实读过类似的堆栈溢出帖子,但没有找到更好的解决方案

CREATE TABLE product_info(
    product_name text,
    key text,
    value text,
    PRIMARY KEY (product_name, key)
);
现在您最多可以插入2B个k/v对,因为键现在是集群列

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');

但是,您没有指定查询访问模式,因此此数据模型对于您的应用程序来说可能是完全错误的(或正常的)

你考虑过使用地图吗

create table products(
 id text primary key,
 something text,
 attributes map<text, text>
);
创建表格产品(
id文本主键,
一些文字,
属性映射
);

参见

的结尾,对于正常情况,答案看起来不错。但结果表仍然是垂直的。我需要一个水平缩放表。就像,每个新值都必须作为列而不是行添加。Hi-Sunjith,C*是宽列。“行”只是底层物理宽列的CQL抽象。如果查看
cassandra cli
中的数据,您将看到一个分区键后跟一列接一列。CQL中的“垂直行”是物理上宽的列。CQL只不过是一种抽象,它将物理宽列显示为垂直行(类似,但与RDBMS中的CTE不同)。@AkbarAhmed我认为你的答案与他的问题无关。在他的例子中,他并不关心数据将如何实际存储在光盘上。如果您从这样的CF中选择,您仍然会看到一个垂直表。他在问如何在一行中添加列。例如,他可能希望将firmaware版本作为没有值的新列。在这样的示例中,如果您选择这样的CF,您将获得一行很宽的数据。据我所知,CQL3已经不可能了。@I4004 CQL3仍然有宽列。存储与节俭完全相同,唯一的区别在于数据的投影方式。CQL在宽列数据上投影关系结构。请看:@AkbarAhmed,是的,我读过这篇文章。但是您可以看到,表的结构是严格定义的,您不能轻易地将任意列添加到行中。事实上,如果您使用集群,数据实际上将以不同的方式存储,但是您不能再添加新列,您必须更改整个CF来实现这一点。让我们考虑一个例子:在我的CF中,我有2个Cop-PK ID和“权重”。所以现在,我不能再插入一个具有未知列“height”的行了,CQL不允许这样做。这意味着,我不能在节俭理解上制造大的分歧。我的第一个想法是:你做错了™. Cassandra已经是一个键/值存储,并且能够处理这个完全相同的场景OOTB。实际上,您是在另一个键/值存储中模拟一个键/值存储,这没有多大意义,IMHO。因此,第二种方法就是你应该做什么,如果你使用得当,卡桑德拉能够做什么。第一种方法是将简单的事情过度复杂化。是的,我确实浏览了地图。但我认为这不是最好的解决方案。因为这和我的期望不一样你的期望是什么?可以动态添加具有值的新关键点,也可以更新关键点的值。在内部,cassandra维护映射,因此您可以根据映射抽象进行思考。