一、環境准備
需要將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表中的列的順序一致
這樣建出來的表直接就是帶有數據的