Cassandra:具有条件的批处理不能跨越多个表

时间:2016-12-06 13:17:30

标签: cassandra batch-processing datastax cassandra-3.0 nosql

我正在尝试使用Cassandra cpp-driver对批处理内的不同表执行3个条件插入:

BEGIN BATCH 
insert into table1 values (...) IF NOT EXISTS 
insert into table2 values (...) IF NOT EXISTS 
insert into table3 values (...) IF NOT EXISTS 
APPLY BATCH

但是我收到以下错误:

Batch with conditions cannot span multiple tables

如果在Cassandra中无法实现上述目标,那么将多个条件插入作为事务执行并确保所有成功或全部失败的替代方法是什么?

1 个答案:

答案 0 :(得分:5)

我担心没有其他选择。 BATCH环境中的条件语句仅限于一个表格,我不认为将来会有变更的余地。

这是由于Cassandra内部工作原因:包含条件更新的批处理(称为轻量级事务)只能在一个分区中使用,因为它们基于Paxos实现,因为Paxos本身仅在分区级别工作。此外,在同一BATCH中具有多个条件语句的批处理中,必须验证所有条件以使批处理成功。即使一个(且唯一的)条件更新失败,整个批处理也将失败。

您可以在documentation中了解有关# Makes API call resultsreturn = requests.get(url,headers=head) # Grabs text from API call # Data is returned in one long string: # '"Header1,Header2,Header3,Header4\\nR1C1,R1C2,R1C3,R1C4\\nR2C1,R2C2,R2C3,R2C4"' results_json_data = json.dumps(resultsreturn.text) # Splits results into list: # ['"Header1,Header2,Header3,Header4', 'R1C1,R1C2,R1C3,R1C4', 'R2C1,R2C2,R2C3,R2C4"'] list_results_split = results_json_data.split('\\n') #Splits list into dictionary. dict_results = dict(zip(range(len(list_results_split)), list_results_split)) 语句的更多信息。

您的条件更新基本上会受到性能影响,并且批量操作会受到性能影响,而C *会阻止您到目前为止。

在我看来,你设计的类似RDBMS。一个No-SQL替代解决方案,我不知道它是否可以应用于您的用例,但您可以在第4个表中对所有其他3个表进行非规范化数据,然后为此提供单个更新第四桌。