为什么很多人将Cassandra称为面向列的数据库?

ces*_*are 47 data-modeling column-oriented cassandra nosql

在互联网上阅读几篇论文和文档,我发现了很多关于Cassandra数据模型的矛盾信息.有许多将其识别为面向列的数据库,其他作为面向行的数据库,然后将其定义为两者的混合方式.

根据我对Cassandra如何存储文件的了解,它使用*-Index.db文件访问*-Data.db文件的正确位置,在该文件中存储了bloom过滤器,列索引,然后是列的要求的行.

在我看来,这是严格的行导向.有什么我想念的吗?

DNA*_*DNA 52

是的,"以列为导向"的术语有点令人困惑.

Cassandra中的模型是行包含列.要访问最小的数据单元(列),您必须首先指定行名(键),然后指定列名.

因此,在一个名为familyfamily的家庭中,Fruit您可以拥有类似以下示例的结构(包含2行),其中水果类型是行键,每列都有名称和值.

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

orange -> colour    weight  price  origin
          "orange"  120     50     "Spain"
Run Code Online (Sandbox Code Playgroud)

与基于表的关系数据库的一个区别是,可以省略列(橙色没有变化),或者随时添加任意列(橙色具有原点).您仍然可以将上面的数据想象为一个表,尽管是一个稀疏的数据,其中许多值可能为空.

但是,"面向列的"模型也可用于列表和时间序列,其中每个列名称都是唯一的(这里我们只有一行,但我们可能有数千或数百万列):

temperature ->  2012-09-01  2012-09-02  2012-09-03 ...
                40          41          39         ...
Run Code Online (Sandbox Code Playgroud)

这与关系模型完全不同,后者必须将时间序列的条目建模为rows不columns.这种用法通常称为"宽行".


tha*_*_DG 45

Cassandra是一个分区行商店.行被组织成具有所需主键的表.

分区意味着Cassandra可以在应用程序透明的事物中跨多台计算机分发您的数据.随着机器被添加到群集中并从群集中删除,Cassandra将自动重新分区.

行存储意味着像关系数据库一样,Cassandra按行和列组织数据.

  • 面向列或列式数据库以列方式存储在磁盘上.

    例如:表格Bonuses表

     ID         Last    First   Bonus
     1          Doe     John    8000
     2          Smith   Jane    4000
     3          Beck    Sam     1000
    
    Run Code Online (Sandbox Code Playgroud)
  • 在面向行的数据库管理系统中,数据将如下存储: 1,Doe,John,8000;2,Smith,Jane,4000;3,Beck,Sam,1000;

  • 在面向列的数据库管理系统中,数据将按如下方式存储:
    1,2,3;Doe,Smith,Beck;John,Jane,Sam;8000,4000,1000;

  • Cassandra基本上是一个专栏店

  • Cassandra会将上述数据存储为, "Bounses" : { row1 : { "ID":1, "Last":"Doe", "First":"John", "Bonus":8000}, row2 : { "ID":2, "Last":"Smith", "First":"Jane", "Bonus":4000} ... }
  • 阅读本文了解更多详情.

希望这可以帮助.

  • 这是我的正确答案 +1 努力 (2认同)
  • 最好指出您可以为 Cassandra(大表)中的每一行使用不同的列,其中一些甚至可能有数千个,而有些可能仅限于一个。 (2认同)

use*_*236 11

你们两个都很好,可能会让人感到困惑.在示例中

apple -> colour  weight  price variety
         "red"   100     40    "Cox"
Run Code Online (Sandbox Code Playgroud)

apple是键值,列是数据,包含所有4个数据项.从描述中可以看出,所有4个数据项一起存储为单个对象,然后由应用程序解析以提取所需的值.因此,从IO的角度来看,我需要读取整个对象.恕我直言,这本质上是基于行(或对象)而不是基于列.

基于列的存储在仓库中变得流行,因为它为全表扫描(DW)提供极端压缩和减少的IO,但是当您需要拉动每一列(选择*)时,以增加IO的IO为代价.大多数查询不需要每列,并且由于压缩,只需几列就可以大大减少IO的全表扫描.让我举个例子

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

grape -> colour  weight  price variety
         "red"   100     40    "Cox"
Run Code Online (Sandbox Code Playgroud)

我们有两种不同的水果,但都有颜色=红色.如果我们将颜色存储在单独的磁盘页面(块)中,不受重量,价格和变化的影响,那么唯一存储的就是颜色,那么当我们压缩页面时,由于大量的重复数据删除,我们可以实现极端压缩.我们可以存储10,000种颜色,而不是在页面中存储100行(假设).现在要读取所有颜色为红色的内容,它可能是1 IO而不是数千个IO,这对于仓储和分析非常有用,但如果我需要更新整个行,那么OLTP会很糟糕,因为该行可能有数百列和一个更新(或插入)可能需要数百个IO.

除非我遗漏了一些我不会称之为柱状的东西,否则我称之为基于对象.关于如何在磁盘上排列对象仍然不清楚.多个对象是否放在同一磁盘页面中?有没有办法确保具有相同元数据的对象一起使用?至于一个水果可能包含不同于另一个水果的数据,因为它只是元数据或xml或者你想要存储在对象本身中的任何东西,有没有办法确保某些匹配的水果类型存储在一起以提高效率?

拉里


小智 5

列族并不意味着它是面向列的。Cassandra是列家族,但不是面向列的。它将行及其所有列族存储在一起。

Hbase是列族,并且以面向列的方式存储列族。不同的列族分别存储在一个节点中,或者它们甚至可以驻留在不同的节点中。


Jen*_*ens 5

我碰到的最明确的名词是宽栏商店。

它是一种二维键值存储,您可以在其中使用行键和列键来访问数据。

此模型与关系模型(面向行和面向列)之间的主要区别在于,列信息是数据的一部分。

这意味着数据可能是稀疏的。这意味着不同的行不需要共享相同的列名或列数。这将启用半结构化数据或无模式表。

您可以将宽列存储视为可以容纳无数列的表格,因此很宽。

这里有几个链接可以支持此操作: