背景:须要将HBase中表xyz(列簇cf1,列val)迁移至Hivemysql
1. 创建Hive和HBase的映射关系sql
1.1 运行hive shell进入hive命令行模式,运行以下脚本shell
CREATE EXTERNAL TABLE hbase_student(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");
注意:(EXTERNAL表示HBase中已经存在了xyz表;若是HBase中不存在,则去掉EXTERNAL关键字,执行命令后,将会在HBase中建立xyz表)apache
1.2 在Hive中查看app
hbase_student:> show tables
在hbase中查看xyz表:> listoop
2. 插入数据测试测试
2.1 在HBase端xyz表插入数据,并查看:spa
查看表结构:desc ‘xyz’命令行
Hbase表插入一条数据:put ‘xyz’,’0’,’cf1:val’,’lowi’3d
查看表中的数据:scan ‘xyz’
2.1.1 在Hive中的hbase_table_1表查看:select * from hbase_student;
2.2 在Hive端hbase_table_1表插入数据,并查看:
Hive表插入一条数据:insert into hbase_student values (‘1’,’lojun’);
查看数据:select * from hbase_student;
2.2.1 在HBase中的xyz表查看:scan ‘xyz’
3.删除hive表:hive> DROP TABLE IF EXISTS hbase_student;
此时hive表已经删除成功,再去查hbase表’xyz’,发现也已经被删除:
这个问题与hive、hbase表关联的方式有关:
(1)建立hive表无EXTERNAL
CREATE TABLE hbase_student(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");
这种状况是hbase原本没有这张表。hive建表时建立了hbase表。这种状况下,hdfs的hive表目录有hive文件夹,可是里面没有数据(数据是存在hbase里面的)。
当hive使用overwrite关键字进行插入数据时。本来数据不会被删除,有一样的行健会被更新覆盖。由于数据是存在hbase中的,遵照hbase插入数据的规则。
1)当hive删除hive表时,hbase表也会删除。
2)当先删除hbase的时候,先disabled table,而后drop table;
hbase表就被删除了,zookeeper里面也就删除了;
可是hive里面还在,用show tables还能查出来,mysql中TBLS里面还有hive表的信息。可是用select * from hive 查询的时候报错,表不存在(TableNotFoundException)。
而后删除hive里面的表的时候会报错TableNotFoundException)。继续show tables时,发现表已经不在了。TBLS里面也没有hive表了。
(1)EXTERNAL
CREATE EXTERNAL TABLE hbase_student(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");
这种状况是hbase里面已经有这张表了,建立一个hive表去管理这hbase表。
当hive使用overwrite关键字进行插入数据时。跟第一种状况同样。
1)删除hive表对hbase没有影响;
2)可是先删除hbase表hive就会报TableNotFoundException;可是删除hive不会报上面这个错。