Search code examples
javacassandrathrifthectorcassandra-cli

Add columns dynamically in cassandra


I have a table like this in CQL3

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

It is a vertical table . Since I can insert new rows with (key , value ) pair.

Sample data will be :

product_info

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

But what I need is a horizontal table , where I could able to add columns dynamically without altering the table.

product_info

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

I need the structure like the above table , need to keep on add the columns on the fly.

CQL3 provides an option to add columns dynamically , but before that we need to alter the table.

I need to know is there any other method which allows this.

I found that by using thrift api it is possible, but since thrift is not more supported , can not use that.

Is there any other API like hector or anything else supporting this ?

I did go through the similar stack overflow posts , but I didn't get a better solution.


Solution

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

    Now you can insert up to 2B k/v pairs because the key is now the clustering column.

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

    However, you did not specify your query access patterns, so this data model may be totally wrong (or ok) for your application.