我正在从Cassandra中检索数据,并使用java驱动程序中的build in object mapping 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);
为MyObject:
@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);
修改
经过大量的调试后,我想,也许Date不是问题。看来删除工作正常,但并非所有分区都有效。当我调试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)
答案 0 :(得分:2)
我需要查看更多代码才能了解如何发布删除,但也许您没有在删除时指定正确精度的时间戳。
内部时间戳字段是以毫秒为单位的纪元时间。当您查看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。
答案 1 :(得分:1)
我看到批处理语句被删除或超时的问题。您尝试每批执行多少次删除?尝试降低批量大小或一起删除批处理。
请记住,Cassandra中的批处理语句旨在将原子更新应用于多个不同的表。它们实际上并不打算用来将几千个更新打入一个表中。
有关批处理语句如何工作的详细说明,请观看(DataStax MVP)Chris Batey在Avoiding Cassandra Anti-Patterns的网络研讨会上的视频。在16:00分钟,他讨论了在应用批处理语句时集群中发生了什么(确切)。