Cassandra中相同主键的重复行/列
我在Cassandra 3.7中有一个带有sensordata的表/列系列Cassandra中相同主键的重复行/列,cassandra,cql,Cassandra,Cql,我在Cassandra 3.7中有一个带有sensordata的表/列系列 CREATE TABLE test.sensor_data ( house_id int, sensor_id int, time_bucket int, sensor_time timestamp, sensor_reading map<int, float>, PRIMARY KEY ((house_id, sensor_id, time_bucket),
CREATE TABLE test.sensor_data (
house_id int,
sensor_id int,
time_bucket int,
sensor_time timestamp,
sensor_reading map<int, float>,
PRIMARY KEY ((house_id, sensor_id, time_bucket), sensor_time)
)
我认为部分问题在于,这些数据都是使用java和Datastax java驱动程序“实时”编写的,并且它是使用sstableloader与来自另一个源的历史数据一起加载的
无论如何,这是不可能的。
我无法将遗留的cassandra cli连接到此集群,也许这会告诉我一些使用cqlsh无法看到的事情
因此,问题是:*在已知情况下是否会发生这种情况?
*我可以使用cqlsh读取更多原始数据吗?具体写这两行的时间。writetime()-函数不能对主键或集合进行操作,这就是我所拥有的 谢谢 更新: 这是我从评论、答案和其他来源尝试过的
*选择using blobAsBigInt会为所有相同的行提供相同的大整数
*启用thrift后,可以使用cassandra cli进行连接,但无法读取表。3.x之后不支持它
*正在使用sstabledump进行转储,但预计还需要一到两周的时间;) “传感器时间”是主键的一部分。它不在“分区键”中,而是“集群列”。这就是为什么会有两行 但是,在磁盘表中,两个“可视行”都存储在单个Cassandra行上。实际上,它们只是不同的列,CQL只是假装它们是两个“可视行” 澄清-我有一段时间没有与卡桑德拉合作过,所以我可能没有使用正确的术语。当我说“可视行”时,我指的是CQL结果显示的内容 更新 您可以创建以下实验(请忽略并修复我将要做的任何语法错误) 此假定使用复合主键的do表:
- “状态”是“分区键”,并且
- “城市”是“聚集柱” 创建桌面城市( state int, 城市国际, 名称文本, 主键((州)、城市) ); 将值(1,1,'纽约')插入城市(州、城市、名称); 在城市(州、城市、名称)中插入值(1、2、“Corona”) 从state=1的城市中选择*
1, 1, New York
1, 2, Corona
但在磁盘上,它将存储在一行中,如下所示:
+-------+-----------------+-----------------+
| state | city = 1 | city = 2 |
| +-----------------+-----------------+
| | city | name | city | name |
+-------+------+----------+------+----------+
| 1 | 1 | New York | 2 | Corona |
+-------+------+----------+------+----------+
当您有这样的复合主键时,您可以在其上选择或删除,例如
select * from cities where state = 1;
delete from cities where state = 1;
在问题中,主键定义为:
PRIMARY KEY ((house_id, sensor_id, time_bucket), sensor_time)
这意味着
- “房屋id”、“传感器id”、“时间桶”是“分区密钥”,并且
- “传感器时间”是“群集列”
然后阅读“复合Enchilada”中的解释。我不希望在时间戳字段中看到纳秒,而且我觉得它们完全不受支持?试试这个:
从test.sensor\u data中选择house\u id、sensor\u id、time\u bucket、blobAsBigint(sensor\u time)代码>
我可以通过一个整数插入行来复制它:
插入传感器数据(房屋id、传感器id、时间桶、传感器时间)值(1,2,41451692800000);
将值(1,2,41451692800001)插入传感器数据(房屋id、传感器id、时间桶、传感器时间);
这是有道理的,因为我怀疑您的一个驱动程序正在使用bigint插入时间戳,而另一个很可能实际使用了datetime
尝试同时使用时区和大整数来复制此。。。似乎只有bigint是可复制的
house_id | sensor_id | time_bucket | sensor_time | sensor_reading
----------+-----------+-------------+--------------------------+----------------
1 | 2 | 3 | 2016-01-02 00:00:00+0000 | null
1 | 2 | 4 | 2016-01-01 23:00:00+0000 | null
1 | 2 | 4 | 2016-01-02 00:00:00+0000 | null
1 | 2 | 4 | 2016-01-02 00:00:00+0000 | null
1 | 2 | 4 | 2016-01-02 01:01:00+0000 | null
编辑:尝试了一些用bigint代替datetime插入的恶作剧,成功地复制了…我不认为这是真的,至少在3.x之后不会。无论它是如何保存的,如果整个主键相同,则在读取时都应该对其进行过滤。datastax网站对此有很好的解释,但我找不到它。我将用你能做的实验进行编辑。你能用cassandra cli检查数据吗?不,cassandra cli在3.x中不受支持。我可以做sstabledump,但是数据文件很大,而且该工具不提供任何过滤。我相信这两行的传感器时间不同,但是会被截断并显示为时间相同。你也可以问卡桑德拉邮件列表。你知道发生了什么吗?没有。我改成代码删除重复的邮件,如果发现的话。我猜“bug”或其他什么东西仍然存在。像你这样用整数插入也会给我两行,但是,它们显示了正常打印和用blobAsBigInt
打印的不同值。在我的大型集群上运行此命令时,我得到了所有3行的blobAsBigInt
的相同值。@安德烈,我也有点不知所措。根据我对卡桑德拉的了解,你所拥有的应该是不可能的。我很想知道你的调查结果。再想一想,您是否正在查询多个节点?descripe test.sensor_data的输出是什么?我可以从
上的跟踪中看到,我只查询了一个节点。查询其他节点或添加一致性all
会产生相同的结果,因此此“错误”出现在所有保存数据的节点上。。。我会用descripe表进行验证,并确保键实际上是相同的。。。试着复制这个问题。。。。
house_id | sensor_id | time_bucket | sensor_time | sensor_reading
----------+-----------+-------------+--------------------------+----------------
1 | 2 | 3 | 2016-01-02 00:00:00+0000 | null
1 | 2 | 4 | 2016-01-01 23:00:00+0000 | null
1 | 2 | 4 | 2016-01-02 00:00:00+0000 | null
1 | 2 | 4 | 2016-01-02 00:00:00+0000 | null
1 | 2 | 4 | 2016-01-02 01:01:00+0000 | null