我试图动态地向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中的现有表中?
答案 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来实现更高的插入性能。