【问题标题】:Cassandra batch if not exists duplicate behaviourCassandra 批处理如果不存在重复行为
【发布时间】:2017-08-02 21:55:35
【问题描述】:

我正在使用 if not exists 为同一分区批量插入多行。从我的测试来看,如果任何行是重复的,那么所有插入都会失败并且没有插入任何行。我想保留 if not exists 行为,但如果存在重复项并且仍然插入非重复行,则不会使批处理失败。如果有重复,有什么方法可以告诉 Cassandra 不要使批处理失败?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    请注意以下最有可能适用于您的 Cassandra 版本的文档。

    在 Cassandra 2.0.6 及更高版本中,您可以批量在 Cassandra 2.0 中作为轻量级事务引入的条件更新。只有对同一分区所做的更新才能包含在批处理中,因为底层 Paxos 实现在分区的粒度上工作。您可以将具有条件的更新与没有条件的更新分组,但是当批处理中的单个语句使用条件时,整个批处理将使用单个 Paxos 提议提交,就好像批处理中包含的所有条件都适用一样。

    这确认您所遇到的行为是预期的行为。鉴于底层的批处理机制,通过 CQL 做你想做的事情并不容易。

    https://docs.datastax.com/en/cql/3.1/cql/cql_reference/batch_r.html#reference_ds_djf_xdd_xj__batch-conditional

    在不知道您的用例细节的情况下,我最初的想法是质疑您是否真的需要使用这样的 BATCH 语句。如果您需要根据应用程序中的一个事件更新多个表,您仍然可以根据相同的 IF NOT EXISTS 条件将语句批处理在一起。

    【讨论】:

    • 我的用例很简单。我有两个单独的进程将数据插入同一个表中。来自第一个进程 A 的数据优先于来自另一个进程 B 的数据。进程 B 首先从表中读取数据并确保它要插入的数据不存在。问题是进程A可能会在读写数据之间插入数据。这就是为什么我让进程B使用IF NOT EXISTS进行插入,以避免来自进程B的数据覆盖来自进程A的数据。
    • 使用轻量级事务(IF NOT EXISTS)是有道理的,但是为什么需要使用批处理语句。
    • 我实际上是通过 Spark Cassandra 连接器执行此操作的,默认情况下,该连接器将同一分区键的所有插入分组到单个批处理语句中。
    • 您应该使用此信息更新您的问题。有用于批处理的配置选项,位于:github.com/datastax/spark-cassandra-connector/blob/master/doc/…
    • 谢谢,我确实看过那些。我希望 Cassandra 方面能解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2021-04-24
    • 1970-01-01
    • 2015-07-30
    相关资源
    最近更新 更多