背景:須要將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’code
查看錶中的數據: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不會報上面這個錯。