【发布时间】:2015-12-13 01:31:48
【问题描述】:
我正在从 Cassandra 检索数据并使用 Java 驱动程序中的内置对象映射 API 将其映射到一个类。处理完数据后,我想删除它。我的集群键是一个时间戳,它被映射到一个 Date 对象。当我尝试删除一个分区时,它不会被删除。我怀疑这是因为映射到 Date 对象并且那里丢失了一些数据?你有遇到过类似的问题吗?
访问者:
@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)
【问题讨论】: