Phoneix(一)簡介及常用命令


一、簡介

Apache Phoneix是運行在HBase之上的高性能關系型數據庫,通過Phoneix可以像使用jdbc訪問關系型數據庫一樣訪問HBase。

Phoneix操作的表以及數據存儲在HBase上,phoneix只需要和HBase進行表關聯。然后在用工具進行一些讀寫操作。

可以把Phoneix只看成一種代替HBase語法的工具。雖然Java可以用jdbc來連接phoneix操作,但是在生成環境找那個,不可以用OLTP。phoenix在查詢hbase時,雖然做了一些優化,但是延遲還是不小。所以依然用在OLAT中,在將結果返回存儲下來。

說明:

  當今的數據處理大致可以分成兩大類:聯機事務處理OLTP(on-line transaction processing)、聯機分析處理OLAP(On-Line Analytical Processing)。OLTP是傳統的關系型數據庫的主要應用,主要是基本的、日常的事務處理,例如銀行交易。OLAP是數據倉庫系統的主要應用,支持復雜的分析操作,側重決策支持,並且提供直觀易懂的查詢結果.

 

二、常用命令

 1、登錄phoneix shell

python sqlline.py master:2181

2、基本命令

查看table列表  !tables
查看表字段信息  !describe tablename
查看執行歷史  !history
查看table 的索引  !index tablename
其他操作 help

3、插入數據

在Phoneix是沒有Insert語句的,取而代之的是upsert 。
Upsert有兩種用法:
1、upsert into旨在單條插入
upsert into tb values('ak','hhh',222)
upsert into tb(stat,city,num) values('ak','hhh',222)
2、upsert select旨在批量插入
upsert into tb1 (state,city,population) select state,city,population from tb2 where population < 40000;
upsert into tb1 select state,city,population from tb2 where population > 40000;
upsert into tb1 select * from tb2 where population > 40000;

     注意:

    在Phoenix在插入語句並不會像傳統數據庫一樣存在重復數據,因為phoneix是構建在HBase之上的,也就是主鍵唯一。后面插入數據會覆蓋前面的,但是時間戳不一樣。

4、刪除數據

delete from tb; 
清空表中所有記錄,Phoenix中不能使用truncate table tb;
delete from tb where city = 'kenai';
drop table tb;刪除表
delete from system.catalog where table_name = 'int_s6a';
drop table if exists tb;
drop table my_schema.tb;
drop table my_schema.tb cascade;用於刪除表的同時刪除基於該表的所有視圖。

5、更新數據

由於HBase的主鍵設計,相同rowkey的內容可以直接覆蓋,這就變相的更新了數據。
所以Phoenix的更新操作仍舊是upsert into 和 upsert select
upsert into us_population (state,city,population) values('ak','juneau',40711);

6、查詢數據

union all, group by, order by, limit 都支持
select * from test limit 1000;
select * from test limit 1000 offset 100;
select full_name from sales_person where ranking >= 5.0
union all select reviewer_name from customer_review where score >= 8.0

7、創建表

a、加鹽(SALT_BUCKETS)

加鹽Salting能夠通過預分區(pre-splitting)數據到多個region中來顯著提升讀寫性能。本質是在hbase中,rowkey的byte數組的第一個字節位置設定一個系統生成的byte值,這個byte值是由rowkey的byte數組做一個哈希算法,計算來的。

SALT_BUCKETS的值范圍在(1-256):

create table TEST1(host varchar not null primary key, description  varchar)salt_buckets=16;
upsert into TEST1 (host,description) values ('192.168.0.1','s1');
upsert into TEST1 (host,description) values ('192.168.0.2','s2');
upsert into TEST1 (host,description) values ('192.168.0.3','s3');

salted table可以自動在每一個rowkey前面加上一個字節,這樣對於一段連續的rowkeys,
它們在表中實際存儲時,就被自動地分布到不同的region中去了。當指定要讀寫該段區間內的數據時,
也就避免了讀寫操作都集中在同一個region上。簡而言之,如果我們用Phoenix創建了一個saltedtable,
那么向該表中寫入數據時,原始的rowkey的前面會被自動地加上一個byte(不同的rowkey會被分配不同的byte),
使得連續的rowkeys也能被均勻地分布到多個regions。

結果:如圖;

b、Pre-split(預分區)

Salting能夠自動的設置表預分區,但是我們得控制表是如何分區的,所以在使用phoneix建表時,可以精確的指定要根據什么值來做預分區,如下實例:

create table TEST2 (host varchar not null primary key, description varchar) split on ('cs','eu','na');

c、使用多列簇

列簇包含相關的數據都在獨立的文件中,在Phoneix設置多個列簇可以提高查詢性能。

如下建表語句,創建了a,b兩個列簇

create table TEST3 ( mykey varchar not null primary key, a.col1 varchar, a.col2 varchar,  b.col3 varchar);
upsert into TEST3 values ('key1','a1','b1','c1');
upsert into TEST3 values ('key2','a2','b2','c2');

d、使用壓縮

create table test (host varchar not null primary key, description varchar) compression='snappy';

8、創建視圖,刪除視圖

create view "my_hbase_table"( k varchar primary key, "v" unsigned_long) default_column_family='a';
create view my_view ( new_col smallint ) as select * from my_table where k = 100;
create view my_view_on_view as select * from my_view where new_col > 70;
create view v1 as select *  from test where description in ('s1','s2','s3');
drop view my_view;
drop view if exists my_schema.my_view;
drop view if exists my_schema.my_view cascade;

9、創建索引

創建二級索引支持可變數據和不可變數據(數據插入后不再更新)上建立二級索引

create index my_idx on opportunity(last_updated_date desc);全局索引
create index my_idx on event(created_date desc) include (name, payload) salt_buckets=10;覆蓋索引並加鹽
create index my_idx on sales.opportunity(upper(contact_name));函數索引
create index test_index on test (host) include (description);覆蓋索引

10、刪除索引

drop index 索引名 on 表名;

11、默認是可變表,手動創建不可變表

create table hao2 (k varchar primary key, v varchar) immutable_rows=true;
alter table HAO2 set IMMUTABLE_ROWS = false;    修改為可變
alter index index1 on tb rebuild;索引重建是把索引表清空后重新裝配數據。

12、Global Indexing多讀少寫,適合條件較少

CREATE INDEX IPINDEX ON TEST(IP);
調用方法:強制索引 SELECT
/*+ INDEX(TEST IPINDEX) */ * FROM TEST WHERE IP='139.204.122.144';

13、覆蓋索引 Covered Indexes,需要include包含需要返回數據結果的列

create index index1_c on hao1 (age) include(name);  name已經被緩存在這張索引表里了。
對於select name from hao1 where age=2,查詢效率和速度最快
select * from hao1 where age =2,其他列不在索引表內,會全表掃描

14、Local Indexing寫多讀少,不是索引字段索引表也會被使用,索引數據和真實數據存儲在同一台機器上

CREATE LOCAL INDEX IPINDEX ON TEST(IP);

 


免責聲明!

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



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