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

时间:2015-09-16 12:45:07

标签: java cassandra

我正在从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)

2 个答案:

答案 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分钟,他讨论了在应用批处理语句时集群中发生了什么(确切)。