Hadoop學習(7)——Hive高級應用(1)

一、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

通過${}方式進行引用,其中systemenv下的變量必須以前綴開頭

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);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章