更新Cassandra行

时间:2016-07-12 23:13:05

标签: cassandra pyspark cqlsh spark-cassandra-connector

我正在使用pysparkpyspark-cassandra

我已经注意到在3.0.x3.6.xCOPY的多个版本的Cassandra(sstableloadersaveToCassandra)上的此行为}}

我有以下架构

pyspark

以及以下数据

CREATE TABLE test (
    id int,
    time timestamp,
    a int,
    b int,
    c int,
    PRIMARY KEY ((id), time)
) WITH CLUSTERING ORDER BY (time DESC);

在数据末尾,有两行具有相同的时间戳。

(1, datetime.datetime(2015, 3, 1, 0, 18, 18, tzinfo=<UTC>), 1, 0, 0)
(1, datetime.datetime(2015, 3, 1, 0, 19, 12, tzinfo=<UTC>), 0, 1, 0)
(1, datetime.datetime(2015, 3, 1, 0, 22, 59, tzinfo=<UTC>), 1, 0, 0)
(1, datetime.datetime(2015, 3, 1, 0, 23, 52, tzinfo=<UTC>), 0, 1, 0)
(1, datetime.datetime(2015, 3, 1, 0, 32,  2, tzinfo=<UTC>), 1, 1, 0)
(1, datetime.datetime(2015, 3, 1, 0, 32,  8, tzinfo=<UTC>), 0, 2, 0)
(1, datetime.datetime(2015, 3, 1, 0, 43, 30, tzinfo=<UTC>), 1, 1, 0)
(1, datetime.datetime(2015, 3, 1, 0, 44, 12, tzinfo=<UTC>), 0, 2, 0)
(1, datetime.datetime(2015, 3, 1, 0, 48, 49, tzinfo=<UTC>), 1, 1, 0)
(1, datetime.datetime(2015, 3, 1, 0, 49,  7, tzinfo=<UTC>), 0, 2, 0)
(1, datetime.datetime(2015, 3, 1, 0, 50,  5, tzinfo=<UTC>), 1, 1, 0)
(1, datetime.datetime(2015, 3, 1, 0, 50, 53, tzinfo=<UTC>), 0, 2, 0)
(1, datetime.datetime(2015, 3, 1, 0, 51, 53, tzinfo=<UTC>), 1, 1, 0)
(1, datetime.datetime(2015, 3, 1, 0, 51, 59, tzinfo=<UTC>), 0, 2, 0)
(1, datetime.datetime(2015, 3, 1, 0, 54, 35, tzinfo=<UTC>), 1, 1, 0)
(1, datetime.datetime(2015, 3, 1, 0, 55, 28, tzinfo=<UTC>), 0, 2, 0)
(1, datetime.datetime(2015, 3, 1, 0, 55, 55, tzinfo=<UTC>), 1, 2, 0)
(1, datetime.datetime(2015, 3, 1, 0, 56, 24, tzinfo=<UTC>), 0, 3, 0)
(1, datetime.datetime(2015, 3, 1, 1, 11, 14, tzinfo=<UTC>), 1, 2, 0)
(1, datetime.datetime(2015, 3, 1, 1, 11, 17, tzinfo=<UTC>), 2, 1, 0)
(1, datetime.datetime(2015, 3, 1, 1, 12,  8, tzinfo=<UTC>), 1, 2, 0)
(1, datetime.datetime(2015, 3, 1, 1, 12, 10, tzinfo=<UTC>), 0, 3, 0)
(1, datetime.datetime(2015, 3, 1, 1, 17, 43, tzinfo=<UTC>), 1, 2, 0)
(1, datetime.datetime(2015, 3, 1, 1, 17, 49, tzinfo=<UTC>), 0, 3, 0)
(1, datetime.datetime(2015, 3, 1, 1, 24, 12, tzinfo=<UTC>), 1, 2, 0)
(1, datetime.datetime(2015, 3, 1, 1, 24, 18, tzinfo=<UTC>), 2, 1, 0)
(1, datetime.datetime(2015, 3, 1, 1, 24, 18, tzinfo=<UTC>), 1, 2, 0)
(1, datetime.datetime(2015, 3, 1, 1, 24, 24, tzinfo=<UTC>), 2, 1, 0)

据我所知,当我保存到卡桑德拉时,其中一个会赢得&#34;赢得&#34; - 只会有一行。

使用

写入cassandra之后
(1, datetime.datetime(2015, 3, 1, 1, 24, 18, tzinfo=<UTC>), 2, 1, 0)
(1, datetime.datetime(2015, 3, 1, 1, 24, 18, tzinfo=<UTC>), 1, 2, 0)

两行似乎都没赢。相反,行似乎有&#34;合并&#34;。

rdd.saveToCassandra(keyspace, table, ['id', 'time', 'a', 'b', 'c'])

而不是包含 1 | 2015-03-01 01:17:43+0000 | 1 | 2 | 0 1 | 2015-03-01 01:17:49+0000 | 0 | 3 | 0 1 | 2015-03-01 01:24:12+0000 | 1 | 2 | 0 1 | 2015-03-01 01:24:18+0000 | 2 | 2 | 0 1 | 2015-03-01 01:24:24+0000 | 2 | 1 | 0 2015-03-01 01:24:18+0000的{​​{1}},它包含(1, 2, 0)

这里发生了什么?我不能为我的生活弄清楚这种行为是由什么造成的。

1 个答案:

答案 0 :(得分:1)

这是一个鲜为人知的效果,来自数据的批处理。批处理写入为批处理中的所有插入分配相同的时间戳。接下来,如果使用完全相同的时间戳完成两次写入,则会有一个特殊的合并规则,因为没有&#34; last&#34;写。 Spark Cassandra Connector默认使用内部分区批处理,因此如果您有这种类型的值,很可能会发生这种情况。

两个相同写入时间戳的行为是基于较大值的合并。

给定表(键,a,b)

Batch
Insert "foo", 2, 1
Insert "foo", 1, 2
End batch

批次为两个突变提供相同的时间戳。卡桑德拉不能选择最后写的&#34;因为它们都是在同一时间发生的,而只是选择了两者的更大价值。合并后的结果将是

"foo", 2, 2