HBase數據遷移至Hive


背景:需要將HBase中表xyz(列簇cf1,列val)遷移至Hive

1. 建立HiveHBase的映射關系

    1.1 運行hive shell進入hive命令行模式,運行如下腳本

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)

1.2 Hive中查看

hbase_student:>  show tables

  在hbase中查看xyz表:>  list

2. 插入數據測試

   2.1 HBasexyz表插入數據,並查看:

  查看表結構:desc ‘xyz’

  Hbase表插入一條數據:put ‘xyz’,’0’,’cf1:val’,’lowi’

  查看表中的數據:scan ‘xyz’

 

  2.1.1 Hive中的hbase_table_1表查看select * from hbase_student;

 

  2.2 Hivehbase_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’,發現也已經被刪除:

 

  這個問題與hivehbase表關聯的方式有關:

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表了。

1EXTERNAL

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不會報上面這個錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM