在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>
现在可以查询同一记录,以确保它位于数据存储中。要获取记录,请执行以下操作:
如果您第二次输入“Type: category”的值,将其存储为“beans”而不是其原始值“ coffee bean”,如下所示怎么办?
hbase(main) :009:0> put 'products', 'product1', 'type:category', 'beans'
0 row(s) in 0.0050 seconds
现在,如果您再次获得该记录,则输出如下:
可能会注意到 type:category 的值现在是 beans 而不是 coffee bean。实际上,这两个值仍存储为同一字段值的不同版本,默认情况下仅返回其中的最新版本。若要查看 type:category 字段的最后四个版本,请运行以下命令:
到目前为止只有两个版本,因此返回它们。
现在,如果数据本质上是非常结构化、有限和关系性的呢?HBase可能根本不是正确的解决方案。
HBase 扁平化数据结构,仅在列系列及其组成列之间创建层次结构。此外,它还沿时间维度存储每个单元格的数据,因此当嵌套数据集存储在 HBase 中时,您需要平展嵌套数据集。
参考零售订单系统
在 HBase 中,可以通过多种方式存储零售订单数据:
-
展平所有数据集,并将订单的所有长片(包括所有产品数据)存储在单行。
-
对于每个订单,维护单行中的所有订单行项目。保存产品信息在单独的表中,并将对产品行键的引用与订单行项目信息一起保存。
使用扁平化订单数据的第一个选项,您最终可能会做出以下选择:
-
为常规订单项创建一个列系列,并为其他类型的订单项(如折扣或返利)创建另一个列系列。
-
在常规订单项列系列中,您可以包含商品或产品名称、商品或产品描述、数量和价格的列。如果你把所有东西都弄平了,请记住为每个行项目使用不同的键,否则它们最终将作为同一键/值对的版本存储在一起。例如,调用产品名称列product_name_1而不是product_name调用所有产品名称列。
本文正在参加「金石计划 . 瓜分6万现金大奖」