在HBase 中使用 Create 操作

286 阅读4分钟

在HBase 中使用 Create 操作

与 MongoDB 数据库不同,面向列的数据库不定义任何关系引用的概念。像所有NoSQL产品一样,它们避免了集合之间的联接。因此,没有跨多个集合的外键或约束的概念。

列数据库以非规范化的方式存储其集合,几乎类似于保存大量事务性非规范化记录的数据仓库事实数据表。数据的存储方式是,行键唯一标识每条记录,并且列系列中的所有列都存储在一起。

面向列的数据库,特别是HBase,也具有保存数据的时间维度。因此,创建或数据插入操作很重要,但实际上不存在更新的概念。

让我们通过一个例子来了解HBase的这些方面。

假设您必须创建和维护一个包含不同类型产品的大型目录,其中有关产品类型、类别、特征、价格和来源的信息量可能会有很大差异。然后,您可能希望创建一个表,其类型、特征和源作为三个列系列。然后,单个属性或字段(也称为列)将属于这些列系列之一。若要在 HBase 中创建此集合或产品表,请先启动 HBase 服务器,然后使用 HBase shell 连接到它。

若要启动 HBase 服务器,请打开命令行窗口或终端,并将其更改为 HBase 安装目录。

然后以本地独立模式启动 HBase 服务器,如下所示:

bin/start-hbase.sh

打开另一个命令行窗口并使用 HBase shell 连接到 HBase 服务器:

bin/hbase shell 接下来,创建产品表:

hbase (main) :001:0 > create 'products', 'type', 'characteristics', 'source'

0 row(s) in 1.1570 seconds

创建表后,可以在其中保存数据。HBase 使用 put 关键字来表示数据创建操作

单词“put”表示用于数据插入的类似哈希映射的操作,并且由于引擎盖下的HBase类似于嵌套的哈希映射,因此它可能比create关键字更合适。

创建具有以下字段的记录:

type:category = "coffee beans"

type:name ="arabica"

type:genus="Coffea"

characteristics:cultivation_method="organic"

characteristics: acidity ="low"

source: country = "yemen"

source: terrain = "mountainous" 

你可以把它放到产品表如下所示:


hbase(main) :001:0> put 'products', 'product1', 'type:category', 'coffee beans'

0 row(s) in 0.0710 seconds

hbase(main) :002:0> put 'products', 'product1', 'type:name', 'arabica'

0 row(s) in 0.0020 seconds

hbase(main):003:0> put 'products', 'product1', 'type:genus', 'Coffea'

0 row(s) in 0.0050 seconds

hbase(main):004:0> put 'products', 'product1', 'characteristics: cultivation_method', 'organic'

0 row(s) in 0.0060 seconds

hbase(main):005:0> put 'products', 'product1', 'characteristics: acidity', 'low'

0 row(s) in 0.0030 seconds

hbase(main) :006:0> put 'products', 'product1', 'source: country', 'yemen'

0 row(s) in 0.0050 seconds

hbase(main):007:0> put 'products', 'product1', 'source: terrain', 'mountainous'

0 row(s) in 0.0050 seconds

hbase(main) :008:0>

现在可以查询同一记录,以确保它位于数据存储中。要获取记录,请执行以下操作:

image.png

如果您第二次输入“Type: category”的值,将其存储为“beans”而不是其原始值“ coffee bean”,如下所示怎么办?

hbase(main) :009:0> put 'products', 'product1', 'type:category', 'beans' 

0 row(s) in 0.0050 seconds

现在,如果您再次获得该记录,则输出如下:

image.png

可能会注意到 type:category 的值现在是 beans 而不是 coffee bean。实际上,这两个值仍存储为同一字段值的不同版本,默认情况下仅返回其中的最新版本。若要查看 type:category 字段的最后四个版本,请运行以下命令:

image.png

到目前为止只有两个版本,因此返回它们。

现在,如果数据本质上是非常结构化、有限和关系性的呢?HBase可能根本不是正确的解决方案。

HBase 扁平化数据结构,仅在列系列及其组成列之间创建层次结构。此外,它还沿时间维度存储每个单元格的数据,因此当嵌套数据集存储在 HBase 中时,您需要平展嵌套数据集。

参考零售订单系统

在 HBase 中,可以通过多种方式存储零售订单数据:

  • 展平所有数据集,并将订单的所有长片(包括所有产品数据)存储在单行。

  • 对于每个订单,维护单行中的所有订单行项目。保存产品信息在单独的表中,并将对产品行键的引用与订单行项目信息一起保存。

使用扁平化订单数据的第一个选项,您最终可能会做出以下选择:

  • 为常规订单项创建一个列系列,并为其他类型的订单项(如折扣或返利)创建另一个列系列。

  • 在常规订单项列系列中,您可以包含商品或产品名称、商品或产品描述、数量和价格的列。如果你把所有东西都弄平了,请记住为每个行项目使用不同的键,否则它们最终将作为同一键/值对的版本存储在一起。例如,调用产品名称列product_name_1而不是product_name调用所有产品名称列。


本文正在参加「金石计划 . 瓜分6万现金大奖」