Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra中相同主键的重复行/列_Cassandra_Cql - Fatal编程技术网

Cassandra中相同主键的重复行/列

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),

我在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), 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”、“时间桶”是“分区密钥”,并且
  • “传感器时间”是“群集列”
因此,当您选择时,实际行将被吐出并显示为有多行

更新

主键定义由两部分组成:分区键 和聚类列。第一部分映射到存储引擎 行键,而第二个用于对行中的列进行分组。在 存储引擎列通过在其名称前加前缀进行分组 集群列的值。这是一个标准的设计模式 当使用Thrift API时。但现在CQL负责将 将列值聚集到表中的非关键字段中,或从中聚集


然后阅读“复合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