[Hive]Hive執行指令碼的方式以及轉義字元
阿新 • • 發佈:2019-01-06
1. hive指令碼的執行方式
hive指令碼的執行方式大致有三種:
1. hive控制檯
執行;
2. hive -e "SQL"
執行;
3. hive -f SQL檔案
執行;
參考hive的用法
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database <databasename> Specify the database to use
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-H,--help Print help information
-h <hostname> connecting to Hive Server on remote host
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-p <port> connecting to Hive Server on port number
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the
console)
1.1. hive控制檯
執行
顧名思義,是進入hive控制檯以後,執行sql指令碼,例如:
hive> set mapred.job.queue.name=pms;
hive> select page_name, tpa_name from pms.pms_exps_prepro limit 2;
Total MapReduce jobs = 1
Launching Job 1 out of 1
...
Job running in-process (local Hadoop)
2015-10-23 10:06:47,756 null map = 100%, reduce = 0%
2015-10-23 10:06:48,863 null map = 23%, reduce = 0%
2015-10-23 10:06:49,946 null map = 38%, reduce = 0%
2015-10-23 10:06:51,051 null map = 72%, reduce = 0%
2015-10-23 10:06:52,129 null map = 100%, reduce = 0%
Ended Job = job_local1109193547_0001
Execution completed successfully
Mapred Local Task Succeeded . Convert the Join into MapJoin
OK
APP首頁 APP首頁_價格比京東低
APP首頁 APP首頁_價格比京東低
Time taken: 14.279 seconds
hive>
1.2. hive -e "SQL"
方式執行
利用hive -e "SQL"
的方式進入hive控制檯並直接執行sql指令碼,例如:
hive -e "
set mapred.job.queue.name=pms;
set mapred.job.name=[HQL]exps_prepro_query;
select page_name, tpa_name
from pms.pms_exps_prepro
limit 2;"
1.3. hive -f SQL檔案
方式執行
執行sql檔案中的sql指令碼,例如:
pms_exps_prepro.sql檔案內容如下:
set mapred.job.queue.name=pms;
set hive.exec.reducers.max=48;
set mapred.reduce.tasks=48;
set mapred.job.name=[HQL]pms_exps_prepro;
drop table if exists pms.pms_exps_prepro;
create table pms.pms_exps_prepro as
select
a.provinceid,
a.cityid,
a.ieversion,
a.platform,
'${date}' as ds
from track_exps a;
上述檔案中的sql指令碼接收一個日期,接收引數寫法類似${date}
,執行時如下執行:
date=2015-10-22
hive -f pms_exps_prepro.sql --hivevar date=$date
2. hive轉義字元的問題
下面以一個業務場景闡述關於hive轉義字元的問題
track_exps記錄曝光資料,現在小A希望獲取2015-10-20有效的曝光資料
其中有效的曝光記錄是指,
*relatedinfo
欄位滿足數字.數字.數字.數字.數字
的格式,
例如4.4.5.1080100.1
extfield1
欄位滿足request-字串,section-數字
的格式,
例如request-b470805b620900ac492bb892ad7e955e,section-4
對於這個問題,小A寫出瞭如下sql指令碼:
select
*
from track_exps
where ds = '2015-10-20'
and relatedinfo rlike '^4.\d+.\d+.\d+.\d+$'
and extfield1 rlike '^request.+section-\d+$';
但是由於正則表示式是被包含在sql裡面,所以裡面的特殊字元需要轉義
2.1. hive -e "SQL"
的方式執行
改動如下:
hive -e "
set mapred.job.queue.name=pms;
explain select
cityid
from track_exps
where ds = '2015-10-20'
and relatedinfo rlike '\\^4\\.\\\d\\+\\.\\\d\\+\\.\\\d\\+\\.\\\d\\+\\$'
and extfield1 rlike '\\^request\\.\\+section\\-\\\d\\+\\$';"
檢視執行計劃,可以確定正則表示式解析正確了:
...
predicate:
expr: ((relatedinfo rlike '^4.\d+.\d+.\d+.\d+$') and (extfield1 rlike '^request.+section-\d+$'))
type: boolean
...
分析如下:
在
hive -e "SQL"
的執行方式中,"'正則表示式'"
,正則表示式先被一個單引號括起來,再被一個雙引號括起來的,所以正則表示式裡面,\\^
的第一個\
用來解析第二個\
,第二個\
才真正起到了轉義的作用
2.2. hive -f SQL檔案
的方式執行
改動如下:
pms_exps_prepro.sql檔案內容如下:
select
*
from track_exps
where ds = '2015-10-20'
and relatedinfo rlike '\^4\.\\d\+\.\\d\+\.\\d\+\.\\d\+\$'
and extfield1 rlike '\^request\.\+section\-\\d\+\$';
分析如下:
不同於
hive -e "SQL"
的執行方式,因為是sql檔案,所以正則表示式只被一個單引號括起來而已,一個\
就起到了轉義的作用了