20、HBase数据模型操作

HBase数据模型操作

在HBase 中有四个主要的数据模型操作,分别是:Get、Put、Scan 和 Delete。

Get(读取)

Get指定行的返回属性。读取通过 Table.get 执行。

Get操作的语法如下所示:

get ’<table name>’,’row1’

在以下的 get 命令示例中,我们扫描了 emp 表的第一行:

hbase(main):012:0> get 'emp', '1'

   COLUMN                     CELL

personal : city timestamp=1417521848375, value=hyderabad

personal : name timestamp=1417521785385, value=ramu

professional: designation timestamp=1417521885277, value=manager

professional: salary timestamp=1417521903862, value=50000

4 row(s) in 0.0270 seconds

读取指定列

下面给出的是使用 get 操作读取指定列语法:

hbase>get 'table name', ‘rowid’, {COLUMN => ‘column family:column name ’}

在下面给出的示例表示用于读取 HBase 表中的特定列:

hbase(main):015:0> get 'emp', 'row1', {COLUMN=>'personal:name'}

  COLUMN                CELL

personal:name timestamp=1418035791555, value=raju

1 row(s) in 0.0080 seconds

Put(写)

Put可以将新行添加到表中(如果该项是新的)或者可以更新现有行(如果该项已经存在)。Put 操作通过 Table.put(non-writeBuffer)或 Table.batch(non-writeBuffer)执行。

Put操作的命令如下所示,在该语法中,你需要注明新值:

put ‘table name’,’row ’,'Column family:column name',’new value’

新给定的值将替换现有的值,并更新该行。

Put操作示例

假设HBase 中有一个表 EMP 拥有下列数据:

hbase(main):003:0> scan 'emp'
 ROW              COLUMN+CELL
row1 column=personal:name, timestamp=1418051555, value=raju
row1 column=personal:city, timestamp=1418275907, value=Hyderabad
row1 column=professional:designation, timestamp=14180555,value=manager
row1 column=professional:salary, timestamp=1418035791555,value=50000
1 row(s) in 0.0100 seconds

以下命令将员工名为“raju”的城市值更新为“Delhi”:

hbase(main):002:0> put 'emp','row1','personal:city','Delhi'
0 row(s) in 0.0400 seconds

更新后的表如下所示:

hbase(main):003:0> scan 'emp'
  ROW          COLUMN+CELL
row1 column=personal:name, timestamp=1418035791555, value=raju
row1 column=personal:city, timestamp=1418274645907, value=Delhi
row1 column=professional:designation, timestamp=141857555,value=manager
row1 column=professional:salary, timestamp=1418039555, value=50000
1 row(s) in 0.0100 seconds

Scan(扫描)

Scan 允许在多个行上对指定属性进行迭代。

Scan 操作的语法如下:

scan ‘<table name>’ 

以下是扫描表格实例的示例。假定表中有带有键 “row1 “、 “row2 “、 “row3 ” 的行,然后是具有键“abc1”,“abc2”和“abc3”的另一组行。以下示例显示如何设置Scan实例以返回以“row”开头的行。

public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...

Table table = ...      // instantiate a Table instance

Scan scan = new Scan();
scan.addColumn(CF, ATTR);
scan.setRowPrefixFilter(Bytes.toBytes("row"));
ResultScanner rs = table.getScanner(scan);
try {
  for (Result r = rs.next(); r != null; r = rs.next()) {
    // process result...
  }
} finally {
  rs.close();  // always close the ResultScanner!
}

请注意,通常,指定扫描的特定停止点的最简单方法是使用 InclusiveStopFilter 类。

Delete(删除)

Delete 操作用于从表中删除一行。Delete 通过 Table.delete 执行。

HBase 不会修改数据,因此通过创建名为 tombstones 的新标记来处理 Delete 操作。这些 tombstones,以及没用的价值,都在重大的压实中清理干净。

使用Delete 命令的语法如下:

delete ‘<table name>’, ‘<row>’, ‘<column name >’, ‘<time stamp>’

下面是一个删除特定单元格的例子:

hbase(main):006:0> delete 'emp', '1', 'personal data:city',
1417521848375
0 row(s) in 0.0060 seconds

删除表的所有单元格

使用“deleteall” 命令,可以删除一行中所有单元格。下面给出是 deleteall 命令的语法:

deleteall ‘<table name>’, ‘<row>’,

这里是使用“deleteall”命令删除 emp 表 row1 的所有单元的一个例子。

hbase(main):007:0> deleteall 'emp','1'
0 row(s) in 0.0240 seconds

使用Scan 命令验证表。表被删除后的快照如下:

hbase(main):022:0> scan 'emp'

ROW                  COLUMN+CELL

2 column=personal data:city, timestamp=1417524574905, value=chennai 

2 column=personal data:name, timestamp=1417524556125, value=ravi

2 column=professional data:designation, timestamp=1417524204, value=sr:engg

2 column=professional data:salary, timestamp=1417524604221, value=30000

3 column=personal data:city, timestamp=1417524681780, value=delhi

3 column=personal data:name, timestamp=1417524672067, value=rajesh

3 column=professional data:designation, timestamp=1417523187, value=jr:engg

3 column=professional data:salary, timestamp=1417524702514, value=25000