最新的 cassandra 是不是仍然支持各个行具有不同的列?

Posted

技术标签:

【中文标题】最新的 cassandra 是不是仍然支持各个行具有不同的列?【英文标题】:Does the latest cassandra still support the individual rows to have different columns?最新的 cassandra 是否仍然支持各个行具有不同的列? 【发布时间】:2020-07-09 08:33:03 【问题描述】:

我是 cassandra 的新手,我正在查看官方文档。我发现 cassandra 中的表概念与 RDBMS 非常相似。

https://cassandra.apache.org/doc/latest/cql/index.html会教我如何创建表、插入表等

但下面是来自https://www.tutorialspoint.com/cassandra/cassandra_data_model.htm。

它说与不固定列族架构的关系表不同,Cassandra 不强制单个行具有所有列。 下图显示了 Cassandra 列族的示例。

我的问题是我在当前的 cassandra 中找不到这个设计,下面是我运行一些简单的插入命令的屏幕截图。

由于我只插入了两列INSERT INTO emp (emp_id, emp_city) VALUES (5, 'abc'),所以其余的都会设置为null,和一般的rdbms很相似。 p>

那么你能告诉我如何在第一张图片中实现“不同的行有不同的列”吗? 非常感谢。

【问题讨论】:

【参考方案1】:

当您省略特定列的数据时,Cassandra 不会插入 null。读取数据时返回null,数据丢失。最好使用sstabledump 检查数据在磁盘上的放置情况。例如,对于我的数据:

cqlsh:test> select * from test.st1;

 id | c1   | s1 | v1
----+------+----+------
 10 | null | 10 | null
  1 |    1 |  2 |    1
  1 |    2 |  2 |    1
  2 |   10 |  3 | null

(4 rows)

对于最后一行,我可以看到我没有实际数据,因为 cells 是空的:

  
    "partition" : 
      "key" : [ "2" ],
      "position" : 97
    ,
    "rows" : [
      
        "type" : "static_block",
        "position" : 144,
        "cells" : [
           "name" : "s1", "value" : 3, "tstamp" : "2019-04-12T14:33:47.198445Z" 
        ]
      ,
      
        "type" : "row",
        "position" : 144,
        "clustering" : [ 10 ],
        "liveness_info" :  "tstamp" : "2019-04-29T12:49:31.450239Z" ,
        "cells" : [ ]
      
    ]
  

但如果我明确插入null

cqlsh:test> insert into test.st1(id, s1, c1, v1) values (3, 10, 3, null);

然后我会在cells里面看到它作为墓碑在数据文件中:

  
    "partition" : 
      "key" : [ "3" ],
      "position" : 0
    ,
    "rows" : [
      
        "type" : "static_block",
        "position" : 39,
        "cells" : [
           "name" : "s1", "value" : 10, "tstamp" : "2020-07-09T09:19:39.751467Z" 
        ]
      ,
      
        "type" : "row",
        "position" : 39,
        "clustering" : [ 3 ],
        "liveness_info" :  "tstamp" : "2020-07-09T09:19:39.751467Z" ,
        "cells" : [
           "name" : "v1", "deletion_info" :  "local_delete_time" : "2020-07-09T09:19:39Z" 
          
        ]
      
    ]
  

【讨论】:

感谢空解释,但如何实现'不同行不同列,如第 1 行有'a'、'b'、'c' 列,第 2 行有'c' 列, 'd','e'?我知道它不能像mysql那样在rdbms中实现。 只需使用insert into table (a, b, c) values (...)insert into table (c, d, e) values (...) 谢谢,我插入6行数据,用sstabledump导出,发现三行在md-2-big-Data.db,其他三行在md-1-big -Data.db,为什么? 因为这就是 Cassandra 的工作方式。它不会就地修改数据,而是将所有更改(插入/更新/删除)附加到文件中,然后在读取或压缩期间对数据进行协调。请阅读 DataStax 架构指南了解更多详情:docs.datastax.com/en/dse/6.7/dse-arch/index.html

以上是关于最新的 cassandra 是不是仍然支持各个行具有不同的列?的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 是不是支持条件查询?

在Cassandra 3.0多节点集群中回收磁盘空间的最佳实践

Stargate REST API 是不是支持 Cassandra 批量查询?

如果您有最新版本的 jquery,livequery 是不是仍然有用?

spark-cassandra-connector 是不是支持内置负载均衡?

Cassandra 是不是支持聚合功能或 Map Reduce 等任何其他功能?