【问题标题】:How to add cassandra table column dynamically?如何动态添加 cassandra 表列?
【发布时间】:2017-11-08 13:10:31
【问题描述】:

我正在尝试向 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 中的现有表?

【问题讨论】:

  • 在 Cassandra 中尝试使用固定的数据模型。并以支持选择查询的方式设计数据模型。
  • 您应该创建一个列并动态输入值,而不是动态创建列并插入值。您的查询是什么样的?围绕该查询构建您的表格。

标签: python cassandra


【解决方案1】:

Cassandra 内部将数据存储为行,每一行都有一个键(Partition key)和动态列数(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代码中执行插入查询:

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,以实现更多的插入性能。

【讨论】:

  • 我的专栏是动态的。如果我创建一个像您的答案一样的表格,那么经过一些处理后如何添加这样的 1000 列?
  • 您可以对您的名称列表执行迭代并对表中的每个分区键执行 INSERT 查询。但是我看不到在没有数据的情况下添加空列的意义。将列名和数据一起添加是有意义的
  • 如何将列名和数据一起添加到现有表中?
  • 我在答案中添加了python示例,但我不是python程序员,但总的来说它显示了这个想法
  • 您正试图在已经有可用列的表中输入数据。我的问题是我们如何动态地向现有表中添加更多包含数据或不包含数据的列?
猜你喜欢
  • 2015-02-21
  • 2018-10-01
  • 2021-07-10
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 2016-04-09
  • 2020-05-26
  • 2020-05-02
相关资源
最近更新 更多