我有一个将数据插入cassandra表的任务,但我不想覆盖之前插入的记录,但insert cql会覆盖现有数据。
幸运的是,我发现'USING TIMESTAMP'的操作,具有较大时间戳的cql将覆盖较小的时间戳,否则不会。因此,使用'USING TIMESTAMP',我可以使用自定义时间戳来确定是否覆盖。它在Cqlsh中工作正常。
但它在python-cassandra-driver中失败了,如何在python-cassandra-driver中使用'USING TIMESTAMP'?我的代码如下:
insert_sql = ("INSERT INTO activate (rowkey, qualifier, info, act_date, log_time) "
"VALUES(%s, %s, %s, %s, %s) "
"USING TIMESTAMP %s")
insert_data = (a_string, a_string, a_string, a_string, a_string, a_custom_timestamp)
session.execute(insert_sql, insert_data)
答案 0 :(得分:1)
这是用于设置自定义时间戳的错误用例。重要的是不要滥用此功能,因为它可能会产生许多意外的副作用,并最终导致数据不可靠。
使用轻量级事务(LWT)(也使用PreparedStatements而不是原始字符串!)
stmt = session.prepare("
INSERT INTO activate (rowkey, qualifier, info, act_date, log_time)
VALUES (?, ?, ?, ?, ?)
IF NOT EXISTS
")
results = session.execute(stmt, [arg1, arg2, ...])
了解更多here和here。 LWT因必须触发paxos共识检查而受到性能影响,但它比“read-then-write”方法更好。
更好的是,如果您绝对需要最大限度地提高写入性能,请考虑修改数据模型以包含时间戳:
CREATE TABLE activate (
rowkey text,
insert_time timestamp,
qualifier text,
info text,
act_date timestamp,
log_time timestamp,
PRIMARY KEY (rowkey, insert_time));