shell脚本操作hbase的命令
0.进入hbase shell
./hbase shell
help
help “get” #查看单独的某个命令的帮助
- status 查看状态
- version 查看版本
2.DDL(数据定义语言Data Definition Language)命令
1. 创建表
create ‘表名称’,’列名称1’,’列名称2’,’列名称3’
create 'member','member_id','address','info'
1.1 创建namespace(表空间相当于数据库)
hbase(main):020:0> create_namespace 'cm'
1.2 创建表格和列族
hbase(main):020:0> create 'cm:mydemo','base'
2.列出所有的表
list ‘abc.*’ #显示abc开头的表
3.获得表的描述
describe ‘table_name’
Table play_error_file is ENABLEDplay_error_filecolumn families description{NAME => 'cf',BLOOMFILTER => 'ROW',#根据应用来定,看需要精确到rowkey还是column。bloom filter的作用是对一个region下查找记录所在的hfile有用。一个region下hfile数量越多,bloom filter的作用越明显。适合那种compaction(压缩)赶不上flush速度的应用。VERSIONS => '1',# 通常是3,对于更新比较频繁的应用可以设置为1IN_MEMORY => 'false',KEEP_DELETED_CELLS => 'FALSE',DATA_BLOCK_ENCODING => 'NONE',TTL => 'FOREVER',COMPRESSION => 'NONE',MIN_VERSIONS => '0',BLOCKCACHE =>'true',BLOCKSIZE => '65536',REPLICATION_SCOPE => '0'}
4.删除一个列族 alter,disable, enable
disable 'member' #删除列族时必须先将表给disablealter 'member',{NAME=>'member_id',METHOD=>'delete'}#删除后继续enable 'member'enable 'member'
5.删除表
disable 'table_name'drop 'table_name'
6.查询表是否存在
exists 'table_name'
7.判断表是否enabled
is_enabled 'table_name'
3.DML(data manipulation language)操作
1.插入
在ns1:t1或者t1表里的r1行,c1列中插入值,ts1是时间
put 'ns1:t1', 'r1','c1','value'orput 't1','r1','c1','value'orput 't1','r1','c1','value',ts1orput 't1','r1','c1','value',{ATTRIBUTES=>{'mykey'=>'myvalue'}}put 't1','r1','c1','value',ts1,{ATTRIBUTES=>{'mykey'=>'myvalue'}}put 't1','r1','c1','value',ts1,{VISIBILITY=>'PRIVATE|SECRET}# t是table 't1'表的引用t.put 'r1','c1','value',ts1,{ATTRIBUTES=>{'mykey'=>'myvalue'}}put 'table_name','row_index','info:age','24'put 'table_name','row_index','info:birthday','1987-06-17'put 'table_name','row_index','info:company','tencent'put 'table_name','row_index','address:contry','china'put 'table_name','row_index','address:province','china'put 'table_name','row_index','address:city','shenzhen'
2.获取一条数据
# 获取一个id的所有数据get 'table_name','row_index'# 获取一个id,一个列族的所有数据get 'table_name','row_index','info'# 获取一个id,一个列族中一个列的所有数据get 'table_name','row_index','info:age'
3.更新一条记录
将qy的单位改为qq
put ‘table_name’,’qy’,’info:company’,’qq’
4.通过timestrap来获取两个版本的数据
# 得到company为tencent的记录get 'table_name','qy',{COLUMN=>'info:company',TIMESTRAP=>1321586238965}# 得到company为qq的数据get 'table_name','qy',{COLUMN=>'info:company',TIMESTRAP=>1321586271843}
5.全表扫描
scanner规范:
TIMERANGE,
FILTER,
LIMIT,
STARTROW(start row),
STOPROW(stop row),
ROWPREFIXFILTER(row prefix filter,行前缀)
TIMESTAMP,
MAXLENGTH,
or COLUMNS,
CACHE,
or RAW,
VERSIONS
scan 'hbase:meta'scan 'hbase:meta',{COLUMNS => 'info:regioninfo'}scan 'ns1:t1',{COLUMNS=>['c1','c2'],LIMIT=>10,STARTROW=>'xyz'}scan 't1',{COLUMNS=>'c1',TIMERANGE=>[1303668804,1303668904]}scan 't1',{REVERSED=>true}scan 't1',{ ROWPREFIXFILTER=>'row2', FILTER=>"(QualifierFilter(>=,'binary:xyz')) AND (TimestampsFilter(123,456))"}scan 't1',{FILTER => org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1,0)}scan 't1',{CONSISTENCY=>'TIMELINE'}设置操作属性:scan 't1',{COLUMNS => ['c1','c2'],ATTRIBUTES=>{'mykey'=>'myvalue'}}scan 't1',{COLUMNS=>['c1','c2'],AUTHORIZATIONS=>['PRIVATE','SECRET']}有个额外的选项:CACHE_BLOCKS,默认为true还有个选项:RAW,返回所有cells(包括删除的markers和uncollected deleted cells,不能用来选择特定的columns,默认为default)如:scan 't1',{RAW=>true,VERSIONS=>10}
全表扫描一般不会用,数据量大的时候会死人的。。
6.删除记录
# 删除id为temp的记录的'info:age'字段delete 'member','temp','info:age'# 删除整行deleteall 'member','temp'
7.查询表中有多少行
count 'table_name'or有对表t1的引用tt.count
8.清空表
truncate 'table_name'HBase是先将表disable,再drop the table,最后creating table。
1.3 添加数据
hbase(main):025:0> put 'mydemo','001','base:name','zhangsanfen'
1.4 取值行键为001的数据
hbase(main):021:0> get 'mydemo','001',{COLUMN=>'base'}
1.5 添加一个‘adv’列
hbase(main):023:0> alter 'mydemo',{NAME=>'adv'}
1.6 查询两个列族中的一个列的数据
hbase(main):026:0> get 'mydemo','001',{COLUMN=>['base:name','adv:like']}
1.7 查看表结构:desc 'table'
修改版本号,方便查找3历史记录
hbase(main):034:0> alter 'mydemo',{NAME=>'base',VERSIONS=>3}
1.8 当我们修改了三次name的值,通过以下命令查找历史
hbase(main):043:0> get 'mydemo','001',{COLUMN=>'base:name',VERSIONS=>3}
1.9 get查询一个需要有rowkey(substring:截取)
方法一:(截取:substring)
hbase(main):054:0> get 'mydemo','001',{FILTER=>"ValueFilter(=,'substring:120')"}
方法二:(二进制:binary)
hbase(main):055:0> get 'mydemo','001',{FILTER=>"ValueFilter(=,'binary:zhangsanfeng')"}
2.0 scan 全表查
hbase(main):054:0> scan 'mydemo',FILTER=>"ValueFilter(=,'substring:12')"
5.scan查询
1.限制条件
scan ‘qy’,{COLUMNS=>’name’}
scan ‘qy’,{COLUMNS=>’name:gender’}
scan ‘qy’,{COLUMNS=>[‘name’,’foo’]}
限制查找条数:
scan ‘qy’,{COLUMNS=>[‘name’,’foo’],LIMIT=>2}
限制时间范围:
scan ‘qy’,{ FILTER=>"ValueFilter(=,'substring:120')", TIMERANGE=>[1448045892646,1448045892647]}
QualifierFilter:列过滤器
QualifierFilter对列的名称进行过滤,而不是列的值。
scan ‘qy’,{FILTER=>”PrefixFilter(‘t’) AND QualifierFilter(>=,’binary:b’)”}
TimestampsFilter:时间戳过滤器
scan ‘qy’,{FILTER=>”TimestampsFilter(1448069941270,1548069941230)” }
scan ‘qy’,{FILTER=>”(QualifierFilter(>=,’binary:b’)) AND (TimestampsFilter(1348069941270,1548069941270))” }
ColumnPaginationFilter
scan ‘qy’,{FILTER=>org.apache.hbase.filter.ColumnPaginationFilter.new(2,0)}
cannot load Java class org.apache.hbase.filter.ColumnPaginationFilter
hbase shell应用filter
1.导入需要的类
import org.apache.hadoop.hbase.filter.CompareFilterimport org.apache.hadoop.hbase.filter.SingleColumnValueFilterimport org.apache.hadoop.hbase.filter.SubstringComparatorimport org.apache.hadoop.hbase.util.Bytes
2.执行命令
scan 'tablename',STARTROW=>'start',COLUMNS=>['family:qualifier'],FILTER=>SingleColumnValueFilter.new(Bytes.toBytes('family'),Bytes.toBytes('qualifier'))
shell执行hbase命令一:
exec hbase_home/bin/hbase shell <<EOF
status
create 'testtable','colfaml'
list 'testtable'
put 'testtable','myrow-1','colfaml:q1','value-1'
scan 'testtable'
disable 'testtable'
drop 'testtable'
EOF
但是EOF处会自动退出整个脚本,无法执行后面内容,不适用于大的自动化脚本
作者综合hbase官网和一些脚本知识,编写了命令二为可用:
echo "status
create 'testtable','colfaml'
list 'testtable'
put 'testtable','myrow-1','colfaml:q1','value-1'
scan 'testtable'
disable 'testtable'
drop 'testtable'" | hbase_home/bin/hbase shell -n 2>&1
status=$?
echo "The status was " $status
if [ $status == 0 ]; thenecho "功能测试成功"
elseecho "功能测试错误"
fi
echo "完毕"
注:2>&1为错误重定向为标准输出1的意思,即命令正确返回0,错误返回1
前面若添加 > /dev/null 即hbase_home/bin/hbase shell -n > /dev/null 2>&1则为将命令输出到只写文件/dev/null,控制台不打印命令输出,且命令正确返回0,错误返回1
这样解决了自动退出问题的同时还能自动判断命令执行情况
shell批量删除hbase数据
#第一步:通过时间戳找到要删除的数据
#第二步:构建删除数据的shell
#第三步:给delete_all_by_rowkey.sh 加可执行权限 执行删除shell
#!/bin/bash -l
echo '--------------程序从这里开始------------'
# ${1} ns:table_name
# ${2} columns
# ${3} ttl
# ${4} stop_date
# ${5} start_time : if ${4} do not input, the start time is defaults to 0;# hbase(main):002:0> import java.util.Date
# => Java::JavaUtil::Date
# hbase(main):003:0> Date.new(1341304672637).toString()
# => "Tue Jul 03 16:37:52 CST 2012"
# hbase(main):004:0> Date.new(1341301228326).toString()
# => "Tue Jul 03 15:40:28 CST 2012"
# 在shell中,如果e799bee5baa6e4b893e5b19e31333363383464有可读日期,能否转成long类型呢?
# hbase(main):005:0> import java.text.SimpleDateFormat
# => Java::JavaText::SimpleDateFormat
# hbase(main):006:0> import java.text.ParsePosition
# => Java::JavaText::ParsePosition
# hbase(main):015:0> SimpleDateFormat.new("yy/MM/dd").parse("12/07/03",ParsePosition.new(0)).getTime()
# => 1341244800000table_name=${1}
columns=${2}
ttl=${3}
stop_date=${4}
start_date=0
if [ $# -eq 5 ];thenstart_date=${5}
fi
echo "table_name : ${table_name}columns : ${columns}ttl : ${ttl}stop_date : ${stop_date}start_date : ${start_date}
"base_path=$(cd `dirname $0`; pwd)echo '---------------正在创建缓存文件夹--------------'mkdir -p ${base_path}/cache_of_delete/${table_name}/
touch ${base_path}/cache_of_delete/${table_name}/rowkey.txt
touch ${base_path}/cache_of_delete/${table_name}/delete_all_by_rowkey.sh# #######第一步:通过时间戳找到要删除的数据
# 注:这里只有rowkey和其中一列,因为目的是找到rowkey
echo " scan '${table_name}',{COLUMNS=>'${columns}', TIMERANGE=>[${start_date},${stop_date}]}" | hbase shell | grep 'column' | grep 'timestamp' |awk '{print $1}' > ${base_path}/cache_of_delete/${table_name}/rowkey.txt# ######第二步:构建删除数据的shell
echo '#!/bin/bash -l ' > ${base_path}/cache_of_delete/${table_name}/delete_all_by_rowkey.sh
echo 'exec hbase shell <<EOF ' >> ${base_path}/cache_of_delete/${table_name}/delete_all_by_rowkey.shcat ${base_path}/cache_of_delete/${table_name}/rowkey.txt|awk '{print "deleteall '\'${table_name}\''", ",", "'\''"$1"'\''"}' >> ${base_path}/cache_of_delete/${table_name}/delete_all_by_rowkey.shecho "EOF " >> ${base_path}/cache_of_delete/${table_name}/delete_all_by_rowkey.sh# ########第三步:给delete_all_by_rowkey.sh 加可执行权限 执行删除shell
chmod +x ${base_path}/cache_of_delete/${table_name}/delete_all_by_rowkey.sh
#sh ${base_path}/cache_of_delete/${table_name}/delete_all_by_rowkey.sh >> ${base_path}/cache_of_delete/${table_name}/delete.log# ##### 第四步: 修改hbase的TTL值
echo '#!/bin/bash -l ' > ${base_path}/cache_of_delete/${table_name}/alter_ttl.sh
echo 'exec hbase shell <<EOF ' >> ${base_path}/cache_of_delete/${table_name}/alter_ttl.sh
echo 'desc '${table_name}' '>> ${base_path}/cache_of_delete/${table_name}/alter_ttl.sh
echo 'disable '${table_name}' ' >> ${base_path}/cache_of_delete/${table_name}/alter_ttl.sh
echo 'alter '${table_name}', { NAME=>'f',TTL=>'${ttl}'} '>> ${base_path}/cache_of_delete/${table_name}/alter_ttl.sh
echo 'enable '${table_name}' ' >> ${base_path}/cache_of_delete/${table_name}/alter_ttl.sh
echo 'desc '${table_name}' '>> ${base_path}/cache_of_delete/${table_name}/alter_ttl.sh
echo "EOF " >> ${base_path}/cache_of_delete/${table_name}/alter_ttl.sh
chmod +x ${base_path}/cache_of_delete/${table_name}/alter_ttl.sh
#sh ${base_path}/cache_of_delete/${table_name}/alter_ttl.shecho '---------------正在删除缓存文件夹--------------'#rm -rf ${base_path}/cache_of_delete/${table_name}/delete_all_by_rowkey.sh
echo '--------------程序到这里结束------------'
Linux下时间转换的一些命令:
- date +%s 可以得到UNIX的时间戳;
- 用shell将日期时间与时间戳互转:
date -d "2015-08-04 00:00:00" +%s 输出:1438617600
- 而时间戳转换为字符串可以这样做:
date -d @1438617600 "+%Y-%m-%d" 输出:2015-08-04
date -d @1438617600 "+%Y-%m-%d %H:%M:%S" 2015-08-04 00:00:00"
- 如果需要得到指定日期的前后几天:
seconds=`date -d "2015-08-04 00:00:00" +%s` #得到时间戳
seconds_new=`expr $seconds + 86400` #加上一天的秒数86400
date_new=`date -d @$seconds_new "+%Y-%m-%d"` #获得指定日前加上一天的日前
date -d "1970-01-01 UTC 1287331200 seconds" "+%F %T"
date -d @时间戳 "+%Y-%m-%d %H:%M:%S"
current=“2015-03-11 12:33:41”
echo $current
timeStamp=`date -d "$current" +%s` #将current转换为时间戳,精确到秒
currentTimeStamp=$((timeStamp*1000+`date "+%N"`/1000000)) #将current转换为时间戳,精确到毫秒
echo $currentTimeStamp
hbase按照时间戳删除记录
1、按照时间戳范围查询记录
echo "scan 'event_log', { COLUMN => 'cf:sid', TIMERANGE => [1466265600272, 1471622400481]} " | hbase shell > ./record.txt
其中这里的cf:sid和key一致, 时间戳范围需要按照时间自己转换:
#current=`date "+%Y-%m-%d %H:%M:%S"` #获取当前时间,例:2015-03-11 12:33:41
current=“2015-03-11 12:33:41”
echo $current
timeStamp=`date -d "$current" +%s` #将current转换为时间戳,精确到秒
currentTimeStamp=$((timeStamp*1000+`date "+%N"`/1000000)) #将current转换为时间戳,精确到毫秒
echo $currentTimeStamp
2、通过shell命令提取record.txt中的sid字段,并拼成hbase删除行命令
cat record.txt|awk '{print "deleteall '\''event_log'\''", ",", "'\''"$1"'\''"}' > del.sh
3、生成hbase删除脚本
在del.sh头尾分别加上:
#!/bin/sh
exec hbase shell <<EOF
和
EOF
4、执行删除脚本
sh del.sh
hbase的timestamp怎么换算
hbase shell中timestamp转为可读格式hbase(main):002:0> import java.util.Date
=> Java::JavaUtil::Date
hbase(main):003:0> Date.new(1341304672637).toString()
=> "Tue Jul 03 16:37:52 CST 2012"
hbase(main):004:0> Date.new(1341301228326).toString()
=> "Tue Jul 03 15:40:28 CST 2012"
####
在shell中,如果有可读日期,能否转成long类型呢?hbase(main):005:0> import java.text.SimpleDateFormat
=> Java::JavaText::SimpleDateFormat
hbase(main):006:0> import java.text.ParsePosition
=> Java::JavaText::ParsePositionhbase(main):015:0> SimpleDateFormat.new("yy/MM/dd").parse("12/07/03",ParsePosition.new(0)).getTime()
=> 1341244800000
shell脚本操作hbase的命令相关推荐
- 69:shell脚本介绍 | shell脚本结构 | 执行data命令用法 | shell脚本中变量
2019独角兽企业重金招聘Python工程师标准>>> 1.shell脚本介绍: shell是一种脚本语言和传统的开发语言相比,会比较简单: shell有自己语法,可以支持逻辑判断. ...
- Linux系统Shell脚本中的echo命令
Linux系统Shell脚本中的echo命令 echo的作用 输出字符串 格式 echo "字符串内容" 一,显示转义字符 转义字符 ...
- 在 Shell 脚本中跟踪调试命令的执行
文章目录 shell 脚本调试系列 概述 shell 跟踪执行的重要性 shell 脚本调试系列 本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的 ...
- Shell脚本中循环select命令用法笔记
在Shell脚本中,select命令是一种菜单扩展的循环方式. 语法结构如下: select Menu in (list) do command done 说明:当程序运行到select语句时,会自动 ...
- linux命令和shell语言的区别,shell脚本语言与linux命令的联系与区别
使用linux确定是要会使用命令的,就算提供有用户界面,绝大部分功能仍是要经过命令行去操做的.而shell脚本语言也是运行在linux上的脚本语言,对于服务器运维人员也是几乎必需要掌握的.而shell ...
- linux mysql 写shell_Linux—编写shell脚本操作数据库执行sql
修改数据库数据 在升级应用时,我们常常会遇到升级数据库的问题,这就涉及到sql脚本的编写. 一般我们会通过写sql脚本,然后将xxx.sql脚本放到数据库中进行source xxx.sql执行.本篇文 ...
- Linux—编写shell脚本操作数据库执行sql
修改数据库数据 在升级应用时,我们常常会遇到升级数据库的问题,这就涉及到sql脚本的编写. 一般我们会通过写sql脚本,然后将xxx.sql脚本放到数据库中进行source xxx.sql执行 ...
- linux 命令脚本文件,Linux编写shell脚本执行多个命令
背景:Linux做项目写完代码之后,需要用一个文件夹下多个文件进行测试,而且需要对于同一个文件执行多个命令,这个时候如果一个一个命令输入比较繁琐,于是写了一个简单的命令脚本如下: #! /bin/ba ...
- shell脚本操作MYSQL
1.创建脚本test.sh !/bin/bash HOSTNAME="192.168.111.84" #数据库信息 PORT="3306" USERNAME=& ...
- Shell脚本学习之expect命令
一.概述 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而expec ...
最新文章
- DropdownList绑定的两种方法
- cruzer php sandisk 闪迪u盘量产工具_SanDisk Cruzer Micro下载
- Java多线程的实现方式-Thread 类,Runnable 接口
- jupyter中python3如何导入文件_Python·Jupyter Notebook各种使用方法
- 如何绘制逻辑图 — 5. 要素的属性:系统与模块
- SELinux系列(六)——SELinux安全上下文查看方法 详细介绍
- vue.js之过渡效果-css
- 一个关于Booth算法的文章
- SQL Server之dbo
- 《多媒体在初中数学中的运用研究》课题研究报告
- Delphi键盘键值
- 博客图床最佳解决方案
- 智能点餐小程序有哪些基本功能
- Jacobian矩阵的理解
- 如何测试UDP端口连通性
- 推特大裁员后,马斯克与白宫发生冲突!META 大批裁员正在路上
- 薪资随便开、十几家猎头挖,新造车抢人有多疯狂?
- 使用计算机时什么是死机,电脑死机的时候, 电脑在干什么?
- 提升技术认知,参加2021上海QCon技术大会
- oppo手机彩蛋android 9.0,论升级Android9.0的速度,vivo完胜OPPO
热门文章
- SQL 插入时直接插入当前时间
- Linux源码包安装的详细教程
- kindle刷机ttl_亚马逊卡大树kindle voyage修复刷机救砖KV死机变砖忘记密码维修
- Tomcat WBE 服务器详细配置
- Surface 内置原生壁纸下载
- Python调用腾讯API进行营业执照核验
- axure手机页面设计说明_产品经理原型演示——Axure制作手机登陆界面
- 2022年上半年软考高项考试真题(三个科目都有)
- MTK 6735/6739/6755/6763 android8.1 user版本打开root权限(adb root权限和 apk root权限)
- svn服务器端上传已有项目,「svn上传新项目」怎么添加新项目到SVN服务器...