面试题答案
一键面试- 使用
scan
和put
结合实现:scan 'your_table_name', {COLUMNS => 'transaction:amount', FILTER => "SingleColumnValueFilter('transaction', 'amount', >=, 'binary:1000')", CACHE => 1000} do |r| row_key = r[0] put 'your_table_name', row_key, 'transaction:tag', 'high - value' end
- 命令执行逻辑解释:
scan 'your_table_name', {COLUMNS => 'transaction:amount', FILTER => "SingleColumnValueFilter('transaction', 'amount', >=, 'binary:1000')", CACHE => 1000}
:scan
是HBase Shell中用于扫描表的命令。your_table_name
是要操作的表名。COLUMNS => 'transaction:amount'
表示只扫描transaction
列族下的amount
列。FILTER => "SingleColumnValueFilter('transaction', 'amount', >=, 'binary:1000')"
使用过滤器SingleColumnValueFilter
,它会筛选出transaction
列族下amount
列的值大于等于1000
的记录。这里binary:1000
表示以二进制格式比较值。CACHE => 1000
表示每次从服务器获取1000条记录,以减少客户端和服务器之间的交互次数,提高扫描效率。
do |r|... end
:这是Ruby的块语法,对扫描出来的每一条记录r
执行块内的操作。row_key = r[0]
:从扫描的记录r
中提取行键,HBase中每行数据的第一个元素就是行键。put 'your_table_name', row_key, 'transaction:tag', 'high - value'
:使用put
命令,将符合条件的记录(通过行键row_key
定位)在transaction
列族下新增一个tag
列,值为high - value
,从而完成标记操作。
注意:请将 your_table_name
替换为实际的表名。