一、Hive案例
1.1、統計出掉線率最高的前10基站
數據:
record_time:通話時間
imei:基站編號
cell:手機編號
drop_num:掉話的秒數
duration:通話持續總秒數
(1)建表
create table cell_monitor(
record_time string,
imei string,
cell string,
ph_num int,
call_num int,
drop_num int,
duration int,
drop_rate DOUBLE,
net_type string,
erl string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
結果表:
create table cell_drop_monitor(
imei string,
total_call_num int,
total_drop_num int,
d_rate DOUBLE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
(2)load數據
LOAD DATA LOCAL INPATH '/opt/data/cdr_summ_imei_cell_info.csv' OVERWRITE INTO TABLE cell_monitor;
(3)找出掉線率最高的基站
from cell_monitor cm
insert overwrite table cell_drop_monitor
select cm.imei ,sum(cm.drop_num),sum(cm.duration),sum(cm.drop_num)/sum(cm.duration) d_rate
group by cm.imei
sort by d_rate desc;
1.2、統計字個數:WordCount
(1)建表
create table docs(line string);
create table wc(word string, totalword int);
(2)加載數據
load data local inpath '/tmp/wc' into table docs;
(3)統計
from (select explode(split(line, ' ')) as word from docs) w
insert into table wc
select word, count(1) as totalword
group by word
order by word;
(4)查詢結果
select * from wc;
二、Hive 參數
2.1、hive 參數、變量命名
hive當中的參數、變量,都是以命名空間開頭:
命名空間 |
讀寫權限 |
含義 |
hiveconf |
可讀寫 |
hive-site.xml當中的各配置變量 例:hive --hiveconf hive.cli.print.header=true |
system |
可讀寫 |
系統變量,包含JVM運行參數等 例:system:user.name=root |
env |
只讀 |
環境變量 例:env:JAVA_HOME |
hivevar |
可讀寫 |
例:hive -d val=key |
通過${}方式進行引用,其中system、env下的變量必須以前綴開頭
2.2、hive 參數設置方式
1、修改配置文件 ${HIVE_HOME}/conf/hive-site.xml
2、啓動hive cli時,通過--hiveconf key=value的方式進行設置
例:hive --hiveconf hive.cli.print.header=true
3、進入cli之後,通過使用set命令設置
2.3、hive set命令
在hive CLI控制檯可以通過set對hive中的參數進行查詢、設置
set設置:
set hive.cli.print.header=true;
set查看
set hive.cli.print.header
hive參數初始化配置
當前用戶家目錄下的.hiverc文件
如: ~/.hiverc
如果沒有,可直接創建該文件,將需要設置的參數寫到該文件中,hive啓動運行時,會加載改文件中的配置。
hive歷史操作命令集
~/.hivehistory
三、Hive 分桶
3.1、什麼是Hive分桶
分桶表是對列值取哈希值的方式,將不同數據放到不同文件中存儲。
對於hive中每一個表、分區都可以進一步進行分桶。
由列的哈希值除以桶的個數來決定每條數據劃分在哪個桶中
適用場景:數據抽樣( sampling )
3.2、分桶設置
(1)開啓支持分桶
set hive.enforce.bucketing=true;
默認:false;設置爲true之後,mr運行時會根據bucket的個數自動分配reduce task個數。(用戶也可以通過mapred.reduce.tasks自己設置reduce任務個數,但分桶時不推薦使用)
注意:一次作業產生的桶(文件數量)和reduce task個數一致。
(2)往分桶表中加載數據
insert into table bucket_table select columns from tbl;
insert overwrite table bucket_table select columns from tbl;
(3)桶表 抽樣查詢
select * from bucket_table tablesample(bucket 1 out of 4 on columns);
(4)TABLESAMPLE語法:
TABLESAMPLE(BUCKET x OUT OF y)
x:表示從哪個bucket開始抽取數據
y:必須爲該表總bucket數的倍數或因子
3.3、分桶案例
(1)
當表總bucket數爲32時
TABLESAMPLE(BUCKET 3 OUT OF 8),抽取哪些數據?
共抽取2(32/16)個bucket的數據,抽取第2、第18(16+2)個bucket的數據
TABLESAMPLE(BUCKET 3 OUT OF 256),抽取哪些數據?
(2)
CREATE TABLE psn31( id INT, name STRING, age INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
測試數據:
1,tom,11
2,cat,22
3,dog,33
4,hive,44
5,hbase,55
6,mr,66
7,alice,77
8,scala,88
(3)
創建分桶表
CREATE TABLE psnbucket( id INT, name STRING, age INT)
CLUSTERED BY (age) INTO 4 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
加載數據:
insert into table psnbucket select id, name, age from psn31;
抽樣
select id, name, age from psnbucket tablesample(bucket 2 out of 4 on age);