如何使用python-cassandra-driver插入带有自定义时间戳的数据

时间:2015-09-23 09:53:05

标签: python cassandra datastax

我有一个将数据插入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)

1 个答案:

答案 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, ...])

了解更多herehere。 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));