1. 程式人生 > >HBase學習之一: 建立hive和hbase關聯表

HBase學習之一: 建立hive和hbase關聯表

背景:專案中需要使用HQL對源資料進行分析,分析的結果需要做近似於實時的查詢,所以建立的表就需要在hive和hbase之間相關聯,此為背景。

drop table tbl_hive_test;
create external table tbl_hive_test
(
  id   string,
  name string,
  age  string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES("hbase.columns.mapping" = ":key,info:name,info:age")
TBLPROPERTIES("hbase.table.name" = "tbl_hbase_test");

說明:預設第一個欄位為rowkey,即為id。info為列簇,name為列名。hbase.table.name為hive表在habse中的名稱,建立的是外部表(external),hbase該表必須存在,否則報錯(內部表不必在hbase中先建立)
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:MetaException(message:HBase table tbl_hive_test doesn't exist while the table is declared as an external table.)
在hbase shell中先建立create 'tbl_hbase_test','info'
匯入資料:
load data local inpath '/tmp/info.txt' overwrite into table tbl_hive_test partition(dt='20000101');
報錯:
FAILED: SemanticException [Error 10101]: A non-native table cannot be used as target for LOAD
如下所示:
managed native: what you get by default with CREATE TABLE
external native: what you get with CREATE EXTERNAL TABLE when no STORED BY clause is specified
managed non-native: what you get with CREATE TABLE when a STORED BY clause is specified; Hive stores the definition in its metastore, but does not create any files itself; instead, 
it calls the storage handler with a request to create a corresponding object structure
external non-native: what you get with CREATE EXTERNAL TABLE when a STORED BY clause is specified; Hive registers the definition in its metastore and calls the storage handler to check 
that it matches the primary definition in the other system
可看出上述建表語句屬於external non-native,不支援load,只能select另外一張表insert到此表中,建表語句如下:
create table tbl_hive_test1
(
  id   string,
  name string,
  age  string
)
partitioned by(dt string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
用hive的load命令裝載資料:
load data local inpath '/tmp/a.txt' overwrite into table tbl_hive_test1 partition(dt='20000101');
a.txt的內容如下:
1001,zhangsan,19
1002,lisi,25
1003,wangwu,26
1004,zhaoliu,18
2001,limei,22
2002,hangmeimei,24
3005,lineng,17
4001,liqi,20
要在hive檢視到資料,要在hbase中事先put一條資料才能使用hql查詢到hive表中的資料。
put 'tbl_hbase_test','302','info:name','jxz'
put 'tbl_hbase_test','302','info:age','25'
在hbase可檢視 scan 'tbl_hbase_test'或get 'tbl_hbase_test','302'
最後再insert到目標表中
insert overwrite table tbl_hive_test select id,name,age from tbl_hive_test1 where dt='20000101';