通過(guò)hive shell操作phoenix下的hbase表

環(huán)境配置

hive-2.3.2
hbase-1.4.2
phoenix-4.14.0-HBase-1.4
spark-2.3.0-bin-hadoop2.7

想通過(guò)phoenix來(lái)統(tǒng)一hbase表的操作冠王,所以首先在phoenix的shell上創(chuàng)建測(cè)試表并添加一些數(shù)據(jù)

CREATE TABLE TEST( ID VARCHAR not null, TEXT VARCHAR CONSTRAINT PK PRIMARY KEY (ID) ) ;
upsert into TEST values('1001','test-text1');
upsert into TEST values('1002','test-text2');

查詢(xún)顯示數(shù)據(jù)如下:

0: jdbc:phoenix:master> select * from TEST;
+-------+-------------+
|  ID   |    TEXT     |
+-------+-------------+
| 1001  | test-text1  |
| 1002  | test-text2  |
+-------+-------------+
2 rows selected (0.021 seconds)

此時(shí)hbase表里的數(shù)據(jù)是存在的阳惹,因?yàn)橛行枨笤趆ive中來(lái)操作hbase表中的數(shù)據(jù),所以直接想法是在hive中創(chuàng)建一張外部表來(lái)映射到hbase對(duì)應(yīng)的表上赞辩,建表語(yǔ)句如下

CREATE EXTERNAL TABLE TEST(ID string, TEXT string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,0:TEXT") TBLPROPERTIES ("hbase.table.name" = "TEST");

創(chuàng)建后朴沿,執(zhí)行查詢(xún)語(yǔ)句但未查詢(xún)到數(shù)據(jù)

hive> show create table test;
OK
CREATE EXTERNAL TABLE `test`(
  `id` int COMMENT '', 
  `text` string COMMENT '')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.hbase.HBaseSerDe' 
STORED BY 
  'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ( 
  'hbase.columns.mapping'=':key,0:TEXT', 
  'serialization.format'='1')
TBLPROPERTIES (
  'hbase.table.name'='TEST', 
  'transient_lastDdlTime'='1535441141')
Time taken: 0.178 seconds, Fetched: 13 row(s)
hive> select * from test;
OK
Time taken: 1.643 seconds
hive> exit;

在hbase shell中查看存儲(chǔ)的數(shù)據(jù)如下

hbase(main):001:0> scan 'TEST'
ROW  COLUMN+CELL
 1001 column=0:\x00\x00\x00\x00, timestamp=1535528809205, value=x
 1001 column=0:\x80\x0B, timestamp=1535528809205, value=test-text1
 1002 column=0:\x00\x00\x00\x00, timestamp=1535528816321, value=x
 1002 column=0:\x80\x0B, timestamp=1535528816321, value=test-text2
2 row(s) in 0.2990 seconds

可以看到表項(xiàng)的列名(qualifier)都為字節(jié)數(shù)組猜谚,這應(yīng)該是phoenix進(jìn)行的轉(zhuǎn)化,于是手動(dòng)在hbase shell中put一條記錄

hbase(main):001:0> put 'TEST','1003','0:TEXT','test-text3'
0 row(s) in 0.2900 seconds

hbase(main):002:0> scan 'TEST'
ROW  COLUMN+CELL
 1001 column=0:\x00\x00\x00\x00, timestamp=1535528809205, value=x
 1001 column=0:\x80\x0B, timestamp=1535528809205, value=test-text1
 1002 column=0:\x00\x00\x00\x00, timestamp=1535528816321, value=x
 1002 column=0:\x80\x0B, timestamp=1535528816321, value=test-text2
 1003 column=0:TEXT, timestamp=1535529809368, value=test-text3
3 row(s) in 0.0420 seconds

在hive的shell下查詢(xún)記錄為:

hive> select * from test;
OK
1003    test-text3
Time taken: 1.764 seconds, Fetched: 1 row(s)

所以應(yīng)該是需要hive讀取phoenix處理過(guò)的表的相關(guān)的lib
參考https://phoenix.apache.org/hive_storage_handler.html中的描述
在hive-env.sh增加一個(gè)環(huán)境變量,如下

export HIVE_AUX_JARS_PATH=/opt/hive-aux

/opt/hive-aux中存放的是phoenix相關(guān)的lib,選擇兩個(gè)使用到的jar包放入

[root@a9ae631a3a34 hive-aux]# ll
total 183776
-rw-r--r-- 1 root root 107956190 Aug 29 05:51 phoenix-4.14.0-HBase-1.4-client.jar
-rw-r--r-- 1 root root  80217117 Aug 29 04:28 phoenix-4.14.0-HBase-1.4-hive.jar

在hive shell中重新創(chuàng)建外部表,測(cè)試語(yǔ)句如下:

> drop table test;
OK
Time taken: 0.193 seconds
hive> create external table TEST (
    > id string,
    > text string
    > )
    > STORED BY 'org.apache.phoenix.hive.PhoenixStorageHandler'
    > TBLPROPERTIES (
    > "phoenix.table.name" = "TEST",
    > "phoenix.zookeeper.quorum" = "master",
    > "phoenix.zookeeper.znode.parent" = "/hbase",
    > "phoenix.zookeeper.client.port" = "2181",
    > "phoenix.rowkeys" = "id",
    > "phoenix.column.mapping" = "id:ID,text:TEXT"
    > );
OK
Time taken: 2.763 seconds
hive> select * from test;
OK
1001    test-text1
1002    test-text2
Time taken: 1.486 seconds, Fetched: 2 row(s)

這個(gè)數(shù)據(jù)是和phoenix接口中的數(shù)據(jù)是一致的赌渣,但是后面收到在hbase中put的一條數(shù)據(jù)并沒(méi)查詢(xún)到魏铅,這應(yīng)該也驗(yàn)證了不同的接口向hbase中寫(xiě)入的數(shù)據(jù)是有差異的,目前看到的差異是
1.phoenix api中寫(xiě)入的列名轉(zhuǎn)換為byte array
2.hbase shell中put寫(xiě)入的列名是按照string處理的
3.hive處理hbase的列名是按照string處理的

下面我想通過(guò)spark sql來(lái)操作剛才在hbase中創(chuàng)建的TEST表項(xiàng),即環(huán)境描述為
hbase>phoenix>hive>spark-sql這樣的關(guān)系
使用如下命令啟動(dòng)spark-sql shell

/opt/spark-2.3.0-bin-hadoop2.7/bin/spark-sql --master=spark://master:7077 --total-executor-cores=2 --executor-memory=512m --jars=/opt/hive-aux/*

查詢(xún)結(jié)果如下

         > select * from testdb.test;
18/08/29 08:30:31 WARN RpcControllerFactory: Cannot load configured "hbase.rpc.controllerfactory.class" (org.apache.hadoop.hbase.ipc.controller.ClientRpcControllerFactory) from hbase-site.xml, falling back to use default RpcControllerFactory
1001    test-text1
1002    test-text2
Time taken: 11.923 seconds, Fetched 2 row(s)

這個(gè)結(jié)果是與hive shell中的查詢(xún)結(jié)果是一致的
注意:

不要把phoenix-4.14.0-HBase-1.4-client.jar,phoenix-4.14.0-HBase-1.4-hive.jar這兩個(gè)lib直接拷貝到$SPARK_HOME/jars下面,否則會(huì)有一些lib沖突導(dǎo)致的java.lang.NoSuchMethodError異常

補(bǔ)充:
如果hbase表使用多個(gè)字段作為主鍵的表锡垄,映射關(guān)系可參考如下建表語(yǔ)句

#phoenix中建表語(yǔ)句
CREATE TABLE TEST_COMBPK(
ID1 VARCHAR NOT NULL,
ID2 VARCHAR NOT NULL,
NUM DOUBLE,
TEXT VARCHAR
CONSTRAINT PK PRIMARY KEY (ID1, ID2)
);

#hive中建表語(yǔ)句
create external table TEST_COMBPK (
id1 string,
id2 string,
num double,
text string
)
STORED BY 'org.apache.phoenix.hive.PhoenixStorageHandler'
TBLPROPERTIES (
"phoenix.table.name" = "TEST_COMBPK",
"phoenix.zookeeper.quorum" = "master",
"phoenix.zookeeper.znode.parent" = "/hbase",
"phoenix.zookeeper.client.port" = "2181",
"phoenix.rowkeys" = "id1,id2",
"phoenix.column.mapping" = "id1:ID1,id2:ID2,num:NUM,text:TEXT"
);

#不使用phoenix的外部表映射,這種方式并不能讀取從phoenix api寫(xiě)入的數(shù)據(jù)
CREATE EXTERNAL TABLE TEST_COMBPK(ID STRUCT<ID1:STRING, ID2:STRING>, NUM DOUBLE, TEXT STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,0:NUM,0:TEXT"")
TBLPROPERTIES ("hbase.table.name" = "TEST_COMBPK");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沦零,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子货岭,更是在濱河造成了極大的恐慌路操,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千贯,死亡現(xiàn)場(chǎng)離奇詭異屯仗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)搔谴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)魁袜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人敦第,你說(shuō)我怎么就攤上這事峰弹。” “怎么了芜果?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵鞠呈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我右钾,道長(zhǎng)蚁吝,這世上最難降的妖魔是什么旱爆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮窘茁,結(jié)果婚禮上怀伦,老公的妹妹穿的比我還像新娘。我一直安慰自己山林,他們只是感情好房待,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著捌朴,像睡著了一般吴攒。 火紅的嫁衣襯著肌膚如雪张抄。 梳的紋絲不亂的頭發(fā)上砂蔽,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音署惯,去河邊找鬼左驾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛极谊,可吹牛的內(nèi)容都是我干的诡右。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼轻猖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帆吻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起咙边,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤猜煮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后败许,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體王带,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年市殷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愕撰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡醋寝,死狀恐怖搞挣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情音羞,我是刑警寧澤囱桨,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站黄选,受9級(jí)特大地震影響蝇摸,放射性物質(zhì)發(fā)生泄漏婶肩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一貌夕、第九天 我趴在偏房一處隱蔽的房頂上張望律歼。 院中可真熱鬧,春花似錦啡专、人聲如沸险毁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畔况。三九已至,卻和暖如春慧库,著一層夾襖步出監(jiān)牢的瞬間跷跪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工齐板, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吵瞻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓甘磨,卻偏偏與公主長(zhǎng)得像橡羞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子济舆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容