Hbase-shell DML增删改查操作

本文介绍了HBase的基本操作,包括put命令的使用示例、scan和get查询的不同方式,以及delete删除操作。还涵盖了高级选项如时间范围、过滤器和属性设置。适合深入理解HBase的开发者。

规范:
其中ns表示namespace,不填默认default,t表示table,r表示rowKey,c表示column,列用(列簇:列名)表示

增/改:put

增加和修改都使用关键字put来执行

  hbase> put 'ns1:t1', 'r1', 'c1', 'value'
  hbase> put 't1', 'r1', 'c1', 'value'
  hbase> put 't1', 'r1', 'c1', 'value', ts1
  hbase> put 't1', 'r1', 'c1', 'value', {ATTRIBUTES=>{'mykey'=>'myvalue'}}
  hbase> put 't1', 'r1', 'c1', 'value', ts1, {ATTRIBUTES=>{'mykey'=>'myvalue'}}
  hbase> put 't1', 'r1', 'c1', 'value', ts1, {VISIBILITY=>'PRIVATE|SECRET'}

示例:
put ‘table1’, ‘1001’, ‘columnfamily:name’,‘dabingge’

查:

Hbase中查找有两种方式,一种是scan,一种是get,使用详情如下:

  # scan:
  hbase> scan 'hbase:meta'
  hbase> scan 'hbase:meta', {COLUMNS => 'info:regioninfo'}
  hbase> scan 'ns1:t1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'}
  hbase> scan 't1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'}
  hbase> scan 't1', {COLUMNS => 'c1', TIMERANGE => [1303668804000, 1303668904000]}
  hbase> scan 't1', {REVERSED => true}
  hbase> scan 't1', {ALL_METRICS => true}
  hbase> scan 't1', {METRICS => ['RPC_RETRIES', 'ROWS_FILTERED']}
  hbase> scan 't1', {ROWPREFIXFILTER => 'row2', FILTER => "
    (QualifierFilter (>=, 'binary:xyz')) AND (TimestampsFilter ( 123, 456))"}
  hbase> scan 't1', {FILTER =>
    org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)}
  hbase> scan 't1', {CONSISTENCY => 'TIMELINE'}
  For setting the Operation Attributes
  hbase> scan 't1', { COLUMNS => ['c1', 'c2'], ATTRIBUTES => {'mykey' => 'myvalue'}}
  hbase> scan 't1', { COLUMNS => ['c1', 'c2'], AUTHORIZATIONS => ['PRIVATE','SECRET']}
  For experts, there is an additional option -- CACHE_BLOCKS -- which
  switches block caching for the scanner on (true) or off (false).  By
  default it is enabled.  Examples:
  hbase> scan 't1', {COLUMNS => ['c1', 'c2'], CACHE_BLOCKS => false}

示例:
scan ‘ywb_t1’

  # get: 
  hbase> get 'ns1:t1', 'r1'
  hbase> get 't1', 'r1'
  hbase> get 't1', 'r1', {TIMERANGE => [ts1, ts2]}
  hbase> get 't1', 'r1', {COLUMN => 'c1'}
  hbase> get 't1', 'r1', {COLUMN => ['c1', 'c2', 'c3']}
  hbase> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => ts1}
  hbase> get 't1', 'r1', {COLUMN => 'c1', TIMERANGE => [ts1, ts2], VERSIONS => 4}
  hbase> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => ts1, VERSIONS => 4}
  hbase> get 't1', 'r1', {FILTER => "ValueFilter(=, 'binary:abc')"}
  hbase> get 't1', 'r1', 'c1'
  hbase> get 't1', 'r1', 'c1', 'c2'
  hbase> get 't1', 'r1', ['c1', 'c2']
  hbase> get 't1', 'r1', {COLUMN => 'c1', ATTRIBUTES => {'mykey'=>'myvalue'}}
  hbase> get 't1', 'r1', {COLUMN => 'c1', AUTHORIZATIONS => ['PRIVATE','SECRET']}
  hbase> get 't1', 'r1', {CONSISTENCY => 'TIMELINE'}
  hbase> get 't1', 'r1', {CONSISTENCY => 'TIMELINE', REGION_REPLICA_ID => 1}

示例:
get ‘table1’,‘1001’
get ‘table1’ ,‘1001’ , ‘columnfamily:column’

删:

Put a delete cell value at specified table/row/column and optionally
timestamp coordinates.  Deletes must match the deleted cell's
coordinates exactly.  When scanning, a delete cell suppresses older
versions. To delete a cell from  't1' at row 'r1' under column 'c1'
marked with the time 'ts1', do:

  hbase> delete 'ns1:t1', 'r1', 'c1', ts1
  hbase> delete 't1', 'r1', 'c1', ts1
  hbase> delete 't1', 'r1', 'c1', ts1, {VISIBILITY=>'PRIVATE|SECRET'}

The same command can also be run on a table reference. Suppose you had a reference
t to table 't1', the corresponding command would be:

  hbase> t.delete 'r1', 'c1',  ts1
  hbase> t.delete 'r1', 'c1',  ts1, {VISIBILITY=>'PRIVATE|SECRET'}

示例:
delete ‘table1’ , ‘1001’,‘columnfamily:column’

<think>嗯,用户想了解HBaseDML操作,首先我得回忆一下HBase的基本概念。HBase是一个分布式的、面向列的数据库,属于Hadoop生态系统的一部分,主要用于处理大规模数据。DML操作通常指的是数据操作语言,也就是对数据的增删改查。 首先,我需要确定HBase中的DML具体包括哪些操作。根据之前的经验,HBaseDML主要包括Put(插入/更新)、Get(查询)、Delete(删除)和Scan(扫描)。需要分别解释每个操作的作用和使用方法。 然后,用户可能需要知道这些操作的具体语法或API调用方式。HBase通常使用Java API,或者通过Shell命令行进行操作。可能需要分别举例说明,比如在Shell中使用put命令插入数据,用get获取数据,delete删除数据,以及scan进行范围查询。 还要注意HBase的数据模型,比如表、行键、列族、列限定符、时间戳等概念。在解释DML操作时,需要结合这些概念,说明如何指定行键、列族等。例如,插入数据时需要指定表名、行键、列族:列限定符、值等。 另外,用户可能对HBase的版本控制和时间戳有疑问。比如,每次插入相同行键和列的数据会生成新的版本,默认保留的版本数可以通过配置调整。在查询时,可以指定获取特定版本或所有版本的数据。 还需要提到HBase的原子性操作,比如单行操作的原子性,但跨行事务不支持。这可能影响用户在设计数据模型时的考虑。 接下来,考虑用户的使用场景。可能是正在学习HBase,或者在实际项目中需要进行数据操作。所以需要给出实际的例子,比如在Shell中如何执行这些命令,或者在Java API中如何编写代码。例如,put的示例可能包括指定行键、列族、列名和值;get操作可能需要指定行键和要获取的列;delete操作可能需要指定删除的行、列或版本等。 同时,需要注意HBase的一些特性,比如删除操作实际上是打标记,数据在合并阶段才会真正删除。Scan操作可以设置过滤器,进行更复杂的查询,比如前缀过滤、分页等。 可能还需要比较HBaseDML与传统关系型数据库的不同,例如没有复杂的SQL语句,而是更简单的API,强调快速读写和大规模扩展。 最后,检查是否有遗漏的重要点,比如批量操作(如批量插入或删除),或者使用Put和Delete时的注意事项,比如时间戳的手动指定与自动生成的区别。此外,HBase的数据一致性模型,比如强一致性在单个行内,但跨行可能不一致,这也是需要提及的。 总结一下,回答的结构应该先介绍DML的概念,然后逐个讲解每个操作(Put、Get、Delete、Scan),结合示例说明,最后提到注意事项和特性,如版本控制、原子性、数据模型相关的内容。确保用户能够逐步理解每个操作的作用和使用方法,同时了解HBase在这些操作上的特点和限制。</think>HBase DML(数据操作语言)操作指南 HBase作为分布式列式数据库,DML操作主要包含以下核心功能: 一、数据写入操作(Put) 1. 单条数据写入 ```shell hbase> put '表名', '行键', '列族:列名', '值' # 示例 hbase> put 'student', '001', 'info:name', '张三' ``` 2. 多版本写入 ```shell hbase> put 'student', '001', 'info:age', '20' # 时间戳自动生成 hbase> put 'student', '001', 'info:age', '21', 1640995200000 # 指定时间戳 ``` 二、数据查询操作(Get) ```shell hbase> get '表名', '行键' # 带列族过滤 hbase> get 'student', '001', {COLUMN => 'info:name'} # 获取历史版本(需提前设置VERSIONS) hbase> get 'student', '001', {COLUMN => 'info:age', VERSIONS => 3} ``` 三、数据删除操作(Delete) 1. 删除指定单元格 ```shell hbase> delete 'student', '001', 'info:age' ``` 2. 删除整行数据 ```shell hbase> deleteall 'student', '001' ``` 四、范围扫描操作(Scan) ```shell hbase> scan 'student', {STARTROW => '001', ENDROW => '005'} # 带过滤器查询 hbase> scan 'student', {FILTER => "ValueFilter(=, 'binary:张三')"} ``` 关键特性说明: 1. 版本控制机制 - 每个单元格默认保留1个版本(可通过`ALTER`命令修改) - 数据更新自动生成新时间戳版本 - 查询时默认返回最新版本 2. 原子性保证 - 单行操作具有原子性 - 批量操作(如`put`列表)在同一行时具有原子性 3. 删除标记机制 - 执行`delete`时先打删除标记(tombstone) - 实际数据在major compaction时物理删除 最佳实践建议: 1. 行键设计原则 - 采用长度固定(16字节最佳) - 避免使用时间戳直接作为前缀 - 保证写入均匀分布 2. 批量写入优化 ```java List<Put> puts = new ArrayList<>(); puts.add(new Put(Bytes.toBytes("002")).addColumn(...)); table.put(puts); // 批量提交提高吞吐量 ``` 3. 扫描优化技巧 - 设置合理缓存大小:`scan.setCaching(500)` - 指定精确的列族/列名 - 避免全表扫描 注意事项: 1. 删除操作不可逆,建议先执行`get`确认数据 2. 频繁更新同一行可能导致region热点 3. 时间戳精度建议使用毫秒级长整型 4. 禁用`autoFlush`可提升批量写入性能 通过合理运用这些DML操作,可以高效实现海量数据的读写管理。建议结合具体业务场景进行参数调优,必要时使用协处理器(Coprocessor)实现复杂操作
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值