hbase與hive關聯、插入資料
接上一篇文章hbase的基本操作,做進一步深入。細想一下,使用put命令插入資料到hbase,使用get方法從hbase讀取資料還是有諸多不方便。顯然,NO SQL資料庫在某些操作上還是沒有支援SQL的資料庫更加便捷。那麼,是否可以將hbase與什麼關聯一下,既支援hbase的NO SQL又保留SQL的一些特性?答案是hbase與hive關聯可以實現上述需求。
如何關聯
關聯前,先建立hbase表,而後創hive關聯hbase表。這是因為,創hive關聯hbase表時候,會檢查關聯的hbase表是否存在,也會檢查hive欄位與hbase的列值對應關係是否能成立(簡單來說,會檢查hbase的列族,列是否存在)。關聯表時需注意’hbase.columns.mapping’這個值,此值與hive的欄位自上而下一一對應。一般來說,hive的第一行為主鍵,對應到hbase為”key”。另外一個注意點是’hbase.table.name’後需填寫hbase的表名。
create external table test.hbase_test(
key string,
column_1 string,
column_2 string,
column_3 string,
column_4 string,
column_5 string
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with
serdeproperties('hbase.columns.mapping'=':key,column_family_1:column_1,column_family_1:column_2,column_family_2:column_3,column_family_2:column_4,column_family_3:column_family_3' )
tblproperties('hbase.table.name'='hbase_test');
以上,建立了一張hive表test.hbase_test
並與已建立的hbase表關聯hbase_test
。
關聯表後,hbase的NO SQL操作依舊,具體就不介紹了,參考上一篇文章hbase的基本操作。同時,也具有一些HIVE SQL的特性。比如,插入資料的方式豐富了(需注意,hive表插入資料時,不支援指定欄位,故插入時不可指定欄位。否則,執行時會報錯):
insert into test.hbase_test values('key_100', 'value100', 'value100' , 'value100', 'value100', 'value100');
若需插入多條資料:
insert into test.hbase_test values('key_101', 'value101', 'value101', 'value101', 'value101', 'value101'),('key_102', 'value102', 'value102', 'value102', 'value102', 'value102'),('key_103', 'value103', 'value103', 'value103', 'value103', 'value103');
上面插入語句還有另外一種表現形式:
insert into test.hbase_test select 'key_105', 'value105', 'value105', 'value105', 'value105', 'value105' from test.hbase_test;
當需要插入多組資料:
insert into test.hbase_test select 'key_106', 'value106', 'value106', 'value106', 'value106', 'value106' from test.hbase_test union all select 'key_107', 'value107', 'value107', 'value107', 'value107', 'value107' from test.hbase_test;
當然,我說明這種插入方式的重點不是讓你用這樣“蠢”的方法去造資料,其實是為了說明,你可以直接從某張表/某幾張表中取相應的欄位插入到hive中去,在操作大量的資料時,不論是操作便捷性還是執行效率都會答覆提高。
來看一下插入資料後,通過hbase檢視,確認資料是否完整 無誤:
hbase(main):002:0> scan 'hbase_test'
ROW COLUMN+CELL
key_1 column=column_family_1:column_1, timestamp=1534306889023, value=value1
key_1 column=column_family_1:column_2, timestamp=1534306889072, value=value2
key_100 column=column_family_1:column_1, timestamp=1534339263770, value=value100
key_100 column=column_family_1:column_2, timestamp=1534339263770, value=value100
key_100 column=column_family_2:column_3, timestamp=1534339263770, value=value100
key_100 column=column_family_2:column_4, timestamp=1534339263770, value=value100
key_100 column=column_family_3:column_family_3, timestamp=1534339263770, value=value100
key_101 column=column_family_1:column_1, timestamp=1534339607141, value=value101
key_101 column=column_family_1:column_2, timestamp=1534339607141, value=value101
key_101 column=column_family_2:column_3, timestamp=1534339607141, value=value101
key_101 column=column_family_2:column_4, timestamp=1534339607141, value=value101
key_101 column=column_family_3:column_family_3, timestamp=1534339607141, value=value101
key_102 column=column_family_1:column_1, timestamp=1534339607141, value=value102
key_102 column=column_family_1:column_2, timestamp=1534339607141, value=value102
key_102 column=column_family_2:column_3, timestamp=1534339607141, value=value102
key_102 column=column_family_2:column_4, timestamp=1534339607141, value=value102
key_102 column=column_family_3:column_family_3, timestamp=1534339607141, value=value102
key_103 column=column_family_1:column_1, timestamp=1534339607141, value=value103
key_103 column=column_family_1:column_2, timestamp=1534339607141, value=value103
key_103 column=column_family_2:column_3, timestamp=1534339607141, value=value103
key_103 column=column_family_2:column_4, timestamp=1534339607141, value=value103
key_103 column=column_family_3:column_family_3, timestamp=1534339607141, value=value103
key_105 column=column_family_1:column_1, timestamp=1534340772390, value=value105
key_105 column=column_family_1:column_2, timestamp=1534340772390, value=value105
key_105 column=column_family_2:column_3, timestamp=1534340772390, value=value105
key_105 column=column_family_2:column_4, timestamp=1534340772390, value=value105
key_105 column=column_family_3:column_family_3, timestamp=1534340772390, value=value105
key_106 column=column_family_1:column_1, timestamp=1534340914867, value=value106
key_106 column=column_family_1:column_2, timestamp=1534340914867, value=value106
key_106 column=column_family_2:column_3, timestamp=1534340914867, value=value106
key_106 column=column_family_2:column_4, timestamp=1534340914867, value=value106
key_106 column=column_family_3:column_family_3, timestamp=1534340914867, value=value106
key_107 column=column_family_1:column_1, timestamp=1534340914867, value=value107
key_107 column=column_family_1:column_2, timestamp=1534340914867, value=value107
key_107 column=column_family_2:column_3, timestamp=1534340914867, value=value107
key_107 column=column_family_2:column_4, timestamp=1534340914867, value=value107
key_107 column=column_family_3:column_family_3, timestamp=1534340914867, value=value107
key_2 column=column_family_1:column_1, timestamp=1534306889078, value=value4
key_2 column=column_family_1:column_2, timestamp=1534306889083, value=value5
key_3 column=column_family_1:column_2, timestamp=1534306889093, value=value5
key_4 column=column_family_1:column_1, timestamp=1534306889099, value=value1
key_4 column=column_family_2:column_3, timestamp=1534306889104, value=value3
key_4 column=column_family_3:, timestamp=1534306889116, value=value1
key_5 column=column_family_1:column_1, timestamp=1534306889122, value=value1
key_5 column=column_family_2:column_3, timestamp=1534306889128, value=value4
key_5 column=column_family_3:, timestamp=1534306889144, value=value2
12 row(s) in 0.4970 seconds
建立hive表時,可以指定hdfs上的儲存路徑,而後可以通過hadoop命令,put csv格式的檔案至hive表中,此亦不失一種插入資料的方法(在hive相關文章中作詳細說明吧)。