如何动态添加cassandra表列?

时间:2017-06-07 09:09:13

标签: python cassandra

我试图动态地向cassandra表添加新列。我使用的是以下版本 -

cqlsh 5.0.1

我使用python与Cassandra进行交互。我有一个python列表,我希望将其添加为Cassandra表的列名。

Python列表 -

['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T']

目前,我正在迭代一个列表,然后将每个列逐个添加到cassandra表中,如下所示 -

from cassandra.cluster import Cluster
cluster = Cluster(['localhost'])
session = cluster.connect()

session.execute("CREATE KEYSPACE IF NOT EXISTS data WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 3};")
session.execute("use my_data")
session.execute("CREATE TABLE IF NOT EXISTS data.my_data (pk uuid PRIMARY KEY);")
names = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T']

for val in names:
   try:
      session.execute("alter table data.my_data add "+ val +" ascii;")
   except:
      pass

它工作正常,但实际问题是,如果在我的python列表中有超过1000个条目可用,那么cassandra应该有超过1000次点击这将是耗时的。是否可以使用任何不同的方法将列名添加到cassandra中的现有表中?

1 个答案:

答案 0 :(得分:2)

Cassandra在内部将数据存储为行,每行都有一个键(分区键)和动态列数(聚类键)。因此,您可以为列名使用Clustering Key值,例如

CREATE TABLE my_data (
     pk text,
     column text,
     value text,
     PRIMARY KEY (pk, column)
); 

通过常规INSERT查询插入新列和值:

INSERT INTO my_data (pk, column, value) VALUES ('pk1', 'A', 'value A'); 
INSERT INTO my_data (pk, column, value) VALUES ('pk1', 'B', 'value B');
INSERT INTO my_data (pk, column, value) VALUES ('pk1', 'C', 'value C');
...  

获取pk1的所有列:

SELECT * FROM my_data WHERE pk='pk1';

<强>更新

假设您有如上所述的表my_data和 您想要为特定pk值添加一些列和数据。 在python代码中执行insert查询:

pk = 'pk'
columns_data = {'A':'value for A','B':'value  for B','C': 'value for C'} #dynamic column data
for col_name, col_value in columns_data.iteritems():
   try:
      session.execute("INSERT INTO my_data (pk, column, value) VALUES (%s, %s, %s)", (pk, col_name, col_value))
   except:
      pass

此外,您可以使用asynchronous driver's methods来实现更高的插入性能。

相关问题