gpt4 book ai didi

Java驱动程序按时间戳删除分区

转载 作者:行者123 更新时间:2023-11-30 08:09:14 25 4
gpt4 key购买 nike

我正在从 Cassandra 检索数据并使用 Java 驱动程序中内置的对象映射 API 将其映射到一个类。处理数据后,我想将其删除。我的集群键是一个时间戳,它被映射到一个 Date 对象。当我尝试删除分区时,它不会被删除。我怀疑这是因为映射到 Date 对象并且那里丢失了一些数据?你遇到过类似的问题吗?

访问器(accessor):

@Query("SELECT * FROM my_table WHERE id = ? AND event_time < ?")
Result<MyObject> getAllObjectsByTime(UUID id, Date eventToTime);

对象的检索:

MappingManager manager = new MappingManager (_cassandraDatabaseManager.getSession());

CassandraAccessor cassandraAccessor = manager.createAccessor(CassandraAccessor.class);
Result<MyObject> myObjectResult = cassandraAccessor.getAllObjectsByTime(id, eventToTime);

我的对象:

@Table(keyspace = "myKeyspace", name = "my_table ")
public class MyObject
{
@PartitionKey
@Column(name = "id")
private UUID id;

@Column(name = "event_time")
private Date eventTime;
}

删除逻辑:

 PreparedStatement statement = session
.prepare("DELETE FROM my_table WHERE id = ? AND event_time = ?;");


BatchStatement batch = new BatchStatement();

for (MyObject myObject: myObjects)
{
batch.add(statement.bind(myObject.getStoreId(), myObject.getEventTime()));
}

session.execute(batch);

编辑

经过大量调试后我想,也许日期不是问题所在。删除似乎有效,但并非适用于所有分区。当我调试 Java 应用程序时,我得到以下 CQL 语句:

DELETE FROM my_table WHERE id=86a2f31d-5e6e-448b-b16c-052fe92a87c9 AND event_time=1442491082128;

当它通过 Cassandra Java Driver 执行时,分区不会被删除。如果我在 CQLSH 控制台中执行它,分区将被删除。我不知道发生了什么。我开始怀疑 Cassandra Java Driver 有问题。有什么想法吗?


编辑2

这是表格:

CREATE TABLE my_table(
id uuid,
event_time timestamp,
event_data text,
PRIMARY KEY (id, event_time)
) WITH CLUSTERING ORDER BY (event_time DESC)

最佳答案

我需要查看您的更多代码才能了解您是如何发出删除操作的,但您可能没有指定正确的删除精度时间戳。

内部时间戳字段是以毫秒为单位的纪元时间。当您查看 cqlsh 中的时间戳时,它会显示时间戳向下舍入到最接近的秒数,如下所示:

SELECT * from t12 where a=1 and b>'2015-09-16 12:51:49+0000';

a | b
---+--------------------------
1 | 2015-09-16 12:51:49+0000

因此,如果您尝试使用该日期字符串进行删除,则它不会完全匹配,因为实际值类似于 2015-09-16 12:51:49.123+0000

如果您将时间戳显示为以毫秒为单位的纪元时间,那么您可以将其删除:

SELECT a, blobAsBigint(timestampAsBlob(b)) from t12;
a | system.blobasbigint(system.timestampasblob(b))
---+------------------------------------------------
1 | 1442407909964

DELETE from t12 where a=1 and b=1442407909964;

参见 this .

关于Java驱动程序按时间戳删除分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32609000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com