Hbase 表與Hive 表的映射操作


一、環境准備

需要將HBase的jar包拷貝到Hive中,以便Hive運行時能訪問到Hbase

這里演示創建軟連接的方式

ln -s $HBASE_HOME/lib/HBase-common-1.3.1.jar  $HIVE_HOME/lib/HBase-common-1.3.1.jar
ln -s $HBASE_HOME/lib/HBase-server-1.3.1.jar $HIVE_HOME/lib/HBase-server-1.3.1.jar
ln -s $HBASE_HOME/lib/HBase-client-1.3.1.jar $HIVE_HOME/lib/HBase-client-1.3.1.jar
ln -s $HBASE_HOME/lib/HBase-protocol-1.3.1.jar $HIVE_HOME/lib/HBase-protocol-1.3.1.jar
ln -s $HBASE_HOME/lib/HBase-it-1.3.1.jar $HIVE_HOME/lib/HBase-it-1.3.1.jar
ln -s $HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar $HIVE_HOME/lib/htrace-core-3.1.0-incubating.jar
ln -s $HBASE_HOME/lib/HBase-hadoop2-compat-1.3.1.jar $HIVE_HOME/lib/HBase-hadoop2-compat-1.3.1.jar
ln -s $HBASE_HOME/lib/HBase-hadoop-compat-1.3.1.jar $HIVE_HOME/lib/HBase-hadoop-compat-1.3.1.jar

二、Hbase中無表數據

此時hive需要建立一個內部表來管理數據,並且導入數據時只能用insert

數據如下

depid    deptname         sal
10      ACCOUNTING      1700
20      RESEARCH        1800
30      SALES           1900
40      OPERATIONS      1700    

 2.1hive建表語句

create table hive_table(
deptid int,
deptname string,
sal string 
)
--固定格式,什么跟hive映射,就是XXXStorageHandler
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
--這里字段要跟上面的保持一致,意思為deptid作為rowkey,deptname作為info列族中的deptname列
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:deptname,info:num")
--Hbase中的表名
TBLPROPERTIES ("hbase.table.name" = "dept2");

 這里解釋下為什么要用Stored by 而不是  row Format

Hive建表時分本地表(native table)和非本地表(non-native table):

本地表(native table): 指傳統情況下。hive中表的數據是直接存儲在hdfs上!建表時,可以指定ROW FORMAT 和 STORED AS

非本地表(non-native table): hive表中的數據沒有存儲在hdfs上!而是存儲在其他的數據庫中(例如hbase中,mongdb中,kafka中,ES中等等)

建表時指定STORED BY ’類名‘

STORED BY 代表,在向表中讀寫數據時,借助此handler類完成操作!

 

------------------------------------------------------------------------------------------------------

這時可能會報錯:xecution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)V

原因是hive跟Hbase版本不兼容,需要編譯hive源碼

 

 2.2利用insert導入數據

insert into hive_table select * from dept;

三、Hbase已有表數據

跟上個不同的是,這里只允許建外部表

3.1建表語句

CREATE external TABLE hive_HBase_dept_table(
deptid int,
deptname string,
num int
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
--這里要跟Hbase表中的列族和列對應起來 WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:deptname,info:num") TBLPROPERTIES ("hbase.table.name" = "dept")

注意點

hive中表的列的類型,需要和hbase表中存儲的數據類型一致,或需要保證轉換不能失敗!

在進行列的映射時,字段的順序要和hive表中的列的順序一致

 

這樣建出來的表直接就是帶有數據的


免責聲明!

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



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