HQL基本語法及應用案例
摘自:《大數據技術體系詳解:原理、架構與實踐》
一.HQL基本語法
HQL是Hive提供的數據查詢語言,由於Hive巨大的影響力,HQL已被越來越多的Hive On Hadoop系統所支持和兼容。HQL語法非常類似於SQL,目前包括以下幾類語句:
(1)DDL(Data Definition Language,數據定義語言)
DDL主要涉及元數據的創建,刪除及修改。Hive中元數據包括數據庫,數據表,視圖,索引,函數,用戶角色和權限等,具體包括:
數據庫相關的DDL :CREATE/DROP/ALTER/USE Database
數據表相關的DDL :CREATE/DROP/TRUNCATE TABLE
表/分區/列相關的DDL :ALTER TABLE/PARTITION/COLUMN
索引相關的DDL :CREATE/DROP/ALTER INDEX
視圖相關的DDL :CREATE/DROP/ALTER VIRW
函數相關的DDL :CREATE/DROP/ALTER
角色和權限相關的DDL :CREATE/DROP/GRANT/REVOKE ROLES AND PRIVILEGES
HQL的DDL語句的語法跟標准的SQL語法非常相似,為了簡單起見,咱們主要介紹數據表的創建,刪除和修改。
(2)DML(Data Manipulation Language,數據操作語言)
DML定義了數據操作語句,包括:
數據控制語句,包括LOAD,INSERT,UPDATE和DELETE四類語句。
數據檢索語句,包括SELECT查詢語句,窗口和分析函數等。
存儲過程,HIVE存儲過程的實現源自於開源項目HPL/SQL。HPL/SQL項目的目標是為Hive,Spark SQL和Impala等SQL On Hadoop項目實現存儲過程。
HQL中的DML語句的語法跟標准SQL語法非常類似,我們主要介紹數據加載和SELECT查詢語句。
(3)鎖
Hive提供讀寫鎖以避免數據訪問一致性問題。
1>.HQL初體驗
某網站每天產生大量用戶訪問日志,為簡化分析,假設每條訪問日志由六個字段構成:訪問時間,所在國家,用戶編號,用戶訪問的網頁鏈接,客戶端上次請求的鏈接以及客戶端IP,數據格式如下所示(每個字段用","分隔):
1999/01/11 10:12,us,927,www.yahoo.com/clq,www.yahoo.com/jxq,948.323.252.617
1999/01/12 10:12,de,856,www.google.com/g4,www.google.com/uypu,416.358.537.539
1999/01/12 10:12,se,254,www.google.com/f5,www.yahoo.com/soeos,564.746.582.215
1999/01/12 10:12,de,465,www.google.com/h5,www.yahoo.com/agvne,685.631.592.264
1999/01/12 10:12,de,856,www.yinzhengjie.org.cn/g4,www.google.com/uypu,416.358.537.539
......
請問,如何用Hive構建數據表並使用HQL分析這些訪問日志(比如在某一時間段的瀏覽次數)?


[root@storage111 yinzhengjie]# hdfs dfs -ls /tmp/
Found 5 items
d--------- - hdfs supergroup 0 2019-05-20 10:48 /tmp/.cloudera_health_monitoring_canary_files
drwxr-xr-x - yarn supergroup 0 2018-10-19 15:00 /tmp/hadoop-yarn
drwx-wx-wx - root supergroup 0 2019-04-29 14:27 /tmp/hive
drwxrwxrwt - mapred hadoop 0 2019-02-26 16:46 /tmp/logs
drwxr-xr-x - mapred supergroup 0 2018-10-25 12:11 /tmp/mapred
[root@storage111 yinzhengjie]#
[root@storage111 yinzhengjie]#
[root@storage111 yinzhengjie]# ll
total 4
-rw-r--r-- 1 root root 1584 May 20 10:42 PageViewData.csv
[root@storage111 yinzhengjie]#
[root@storage111 yinzhengjie]# hdfs dfs -put PageViewData.csv /tmp/
[root@storage111 yinzhengjie]#
[root@storage111 yinzhengjie]# hdfs dfs -ls /tmp/
Found 6 items
d--------- - hdfs supergroup 0 2019-05-20 10:48 /tmp/.cloudera_health_monitoring_canary_files
-rw-r--r-- 3 root supergroup 1584 2019-05-20 10:49 /tmp/PageViewData.csv
drwxr-xr-x - yarn supergroup 0 2018-10-19 15:00 /tmp/hadoop-yarn
drwx-wx-wx - root supergroup 0 2019-04-29 14:27 /tmp/hive
drwxrwxrwt - mapred hadoop 0 2019-02-26 16:46 /tmp/logs
drwxr-xr-x - mapred supergroup 0 2018-10-25 12:11 /tmp/mapred
[root@storage111 yinzhengjie]#
[root@storage111 yinzhengjie]#
使用HIVE解決該問題可分為三個階段:
階段1:創建數據表page_view,以保證結構化用戶訪問日志:
hive> CREATE TABLE page_view(
> view_time String,
> country String,
> userid String,
> page_url String,
> referrer_url String,
> ip String)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED by '\n'
> STORED AS TEXTFILE;
OK
Time taken: 0.617 seconds
hive>
創建Hive數據表時,需顯式指定數據存儲格式,在以上示例中,TEXTFILE表示文本文件,“,”表示每列分隔符為逗號,而“\n”表示分隔符。
階段2:加載數據。
使用LOAD語句將HDFS上的指定目錄或文件加載到數據表page_view中:
hive> LOAD DATA INPATH "/tmp/PageViewData.csv" INTO TABLE page_view;
Loading data to table test.page_view
Table test.page_view stats: [numFiles=1, totalSize=1584]
OK
Time taken: 0.71 seconds
hive>
階段3:使用HQL查詢數據。
使用類SQL語言生成統計報表,比如“統計某個時間點后來自每個國家的總體訪問次數。”
hive> SELECT country,count(userid) FROM page_view WHERE view_time > "1990/01/12 10:12" GROUP BY country;

hive> SELECT country,count(userid) FROM page_view WHERE view_time > "1990/01/12 10:12" GROUP BY country; Query ID = root_20190520105454_352faf00-c601-4146-be07-14f7db34e311 Total jobs = 1 Launching Job 1 out of 1 Number of reduce tasks not specified. Estimated from input data size: 1 In order to change the average load for a reducer (in bytes): set hive.exec.reducers.bytes.per.reducer=<number> In order to limit the maximum number of reducers: set hive.exec.reducers.max=<number> In order to set a constant number of reducers: set mapreduce.job.reduces=<number> Starting Job = job_1552552068924_7036, Tracking URL = http://storage101.aggrx:8088/proxy/application_1552552068924_7036/ Kill Command = /opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/hadoop/bin/hadoop job -kill job_1552552068924_7036 Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1 2019-05-20 10:55:11,599 Stage-1 map = 0%, reduce = 0% 2019-05-20 10:55:21,001 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 3.83 sec 2019-05-20 10:55:27,300 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 7.49 sec MapReduce Total cumulative CPU time: 7 seconds 490 msec Ended Job = job_1552552068924_7036 MapReduce Jobs Launched: Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 7.49 sec HDFS Read: 10512 HDFS Write: 21 SUCCESS Total MapReduce CPU Time Spent: 7 seconds 490 msec OK cn 1 de 11 se 4 us 4 Time taken: 30.736 seconds, Fetched: 4 row(s) hive>
2>.數據表的創建,刪除和修改
不同於關系型數據庫中的數據表,Hive具有以下特點:
(1)元數據和數據是分離的,元信息保存在Metastore中,數據則保存在分布式文件系統中。
(2)自定義文件格式,Hive中存儲數據的文件格式是用戶自定義的,目前支持文本文件,Sequence File,Avro,ORC和Parquet等數據格式。
(3)運行時數據合法性檢查,關系型數據庫中的數據是插入時進行合法性檢查的,而Hive中的數據則是(HQL翻譯成的)分布式應用程序運行時進行數據合法性檢查的。
(1)Hive數據表的創建
Hive數據表是多層級的,如上圖所示,Hive中可以有多個數據庫,每個數據庫中可以存在多個數據表,每個數據表可進一步划分為多個分區或者數據桶,每個分區內部也可以有多個數據桶。
Hive創建表的語法定義如下(經簡化):
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(cole_name data_type [COMMENT col_comment],...)]
[PARTITIONED BY (col_name data_type [COMMENT col_comment],...)]
[CLUSTERED BY (col_name,col_name,...) INTO num_buckets BUCKETS]
[
[ROW FORMAT row_format]
[STORED AS file_format]
]
[LOCATION hdfs_path]
[TBLPROPERTIES (perperty_name=property_value,...)]
[AS select_statement];
接下來,按照數據表語法定義順序,依次解析各個關鍵字的含義:
1)數據表的類別。Hive數據表分為三類:臨時表(TEMPORARY TABLE),外部表(EXTERNAL TABLE)和受管理表(MANAGED TABLE),其分區如下:
臨時表 : 僅對當前session可見,一旦session退出,該數據表將自動被刪除。
外部表 : 外部表的數據存儲路徑是用戶定義的而非Hive默認存儲位置,外部表被刪除后,其對應的數據不會被清除(僅刪除元數據)。
受管理表 : 默認是數據表的類型,這種表的數據是受Hive管理的,與元數據的生命周期是一致的。
2)數據類型(data_type)。Hive提供了豐富的數據類型,它不僅提供類似於關系型數據庫中的基本數據類型,也提供了對高級數據類型(包括數據,映射表,結構體和聯合體)的支持,具體包括:
基本數據類型 : TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,DOUBLE PRECISON,STRING,BINARY,TIMESTAMP,DECIMAL,DATA,VARCHAR和CHAR的美好。
數組(array) : 類似於Java中的映射表,由Key/value映射對組成的集合,key是value的索引。
結構體(struct): 類似於C語言中的結構體,由一系列具有想用類型或不同類型的數據構成的數據集合。
聯合體(union) : 類似於C語言中的聯合體,與結構體類似,但它將幾種相同或不同類型的變量存放到同一段內存單元中。
3)分區表和分桶表。為了加速數據處理,數據表可進一步划分成更小的存儲單位,即分區或分桶。
分區表 : 數據表可以按照某一個或幾個字段進一步划分成多個數據分區(使用語句“PARTITIONED BY col_name”),不同分區的數據將被存放在不同目錄中。這樣,當一個查詢語句只需要用到里面的若干個分區時,其他分區則可直接跳過掃描,大大節省了不必要的磁盤IO。
分桶表 : 數據表或數據分區可進一步按照某個字段分成若干個桶,比如語句“CLUSTERED BY(userid)INTO 32 BUCKETS"可講數據按照userid這一字段分成32個桶,實際是按照公式"hash_function(bucketing_column) mod num_buckets"計算得到具體桶編號的,其中hash_function與具體的數據類型有關。分桶表對傾斜數據表(某一列或幾列中某些數據值出現次數非常多)分析,數據采樣和多表鏈接(尤其是map side join)等場景有特殊優化。
4)行格式(row format)。該配置用於指定每行的數據格式,僅對行式存儲格式有意義,其語法如下:
DELIMITED [FIELDS TEMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] [NULL DEFINED AS char]
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,property_name=property_value,...)]
在創建數據表時,DELIMITED和SERDE兩種配置最多設置一個(可以不設置)。幾個關鍵字含義如下:
FIELDS TERMINATED BY char : 每行中不同字段的分隔符char。
COLLECTION ITEMS TERMINATED BY char : map,sturct或array中每個元素之間的分隔符char。
MAP KEYS TERMINATED BY char : map中key和value之間的分隔符char。
LINES TERMINATED BY char : 行分隔符char。
舉個例子,我們創建一個person的數據表,由name(姓名)和score(課程成績)兩個字段構成,其中source數據類型為map,key為課程名,value是得分。
CREATE TABLE person(name STRING,score map<STRING,INT>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':';
對應的數據存儲方式為:
Tom 'Math':80,'Chinese':90,'English':95
Bob 'Chinese':60,'Math':80,'English':99
SERDE關鍵字允許用戶通過定制化和反序列化規定數據存儲格式,比如:JSON格式和CSV格式。
5)數據格式(file format)。HIVE支持多種數據存儲格式,包括:
TEXTFILE : 文本文件,這是默認文件存儲格式,用戶可通過"hive.default.fileformat"修改默認值,可選值為:TextFILE,SequenceFile,RCfile或ORC。
SEQUENCEFILE : 二進制存儲格式SequenceFile;
RCFILE : 列式存儲格式;
ORC : 優化的列式存儲格式;
PARQUET : 列式存儲格式;
AVRO : 帶數據模式的存儲格式;
INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname :通過自定義InputFormat和OutputFormat兩個組件定義數據格式。
6)數據存放位置(HDFS path)。每個數據表對應的數據將被存在一個單獨目錄中,具體由參數"hive.metastore.warehouse.dir"指定,默認是"/usr/hive/warehouse/<databasename>.db/<tablenae>/,"比如數據庫school中的表student存放路徑則為:"/user/hive/warehouse/school.db/student/"中。
7)表屬性。Hive允許用戶為數據表增加任意表屬性,每個表屬性以“key/value”的形式存在,Hive也預定了一些表屬性,比如:
TBLPROPERTIES("hbase.table.name"="table_name") : 用於Hive與HBase集成,表示該Hive表對應的HBase表的table_name;
TBLPROPERTIES("orc.compress"="ZLIB") : 用於標注ORC表的壓縮格式,ZLIB為壓縮算法。
(2)Hive數據表的刪除於修改
Hive提供了兩種刪除數據表的語法:
DROP TABLE,語法如下:
DROP TABLE [IF EXISTS] table_name [PUTCE];
刪除指定數據表的數據和元信息,其中數據將被移動到垃圾箱,除非設置了“PURGE”標志,則跳過垃圾箱直接永久清除。需要注意的是,如果指定了數據表是外表,則僅會清理元信息。
TRUNCATE TABLE,語法如下:
TRUNCATE TABLE table_name [PATTITION partition_spec];
數據指定數據表的全部數據或某個分區,默認情況下,刪除的數據將被移動到垃圾箱。
3>. 數據的查詢語句
HQL數據查詢語句的語法和標准SQL非常類似,具體如下:
[WITH CommonTableExpression (,CommonTableExpression)*]
SELECT [ALL | DISTINCT] select_expr,select_expr,...
FROM table_eference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT number]
接下來說明幾處與標准SQL不同之處:
(1)WHIH CommonTableExpression (,CommonTableExpresson):Hive提供了一種將子查詢作為一個數據表的語法,叫做Common Table Expression(CTE),比如從表t中選出兩種類型的數據,並合並在一起為輸出:
with t1 as (select * from t where key = '5'),
t2 as (select * from t where key = '4')
select * from t1 union all select * from t2;
(2)ORDER BY 和SORT BY:ORDER BY和SORT BY兩個語句均是數據表和數據按照指定的排序鍵進行排序,但排序方式稍有不同,具體需從底層計算引擎MapReduce角度理解。ORDER BY用於全局排序,就是對指定的所有排序鍵進行全局排序,使用ORDER BY的查詢語句,最后會有一個Reduce Task來完成全局排序(即只會啟動一個Reduce Task);SORT By用於分區內排序,即每個Reduce任務內部排序(即最終啟動多個Reduce Task並行排序)。
(3)DISTRIBUTE BY 和CLUSTER BY:DISTRIBUTE BY語句能按照指定的字段或表達式對數據進行划分,輸出到對應的Reduce Task或者文件中。CLUSTER BY等價於DISTERIBUTE BY與SORT BY組合,比如以下兩條HQL語句等價。
SELECT col1,col2 FROM t1 CLUSTER BY col1;
SELECT col1,col2 FROM t1 DISTRIBUTE BY coll SORT BY coll;
當數據量特別大,需要對最終結果進行排序時,建議采用DISTRIBUTE BY結合SORT BY語句,比如統計每個url對應的用戶行為日志,並按照時間結果排序,如果采用DISTRIBUTE + SORT BY方式,HQL語句如下:
set mapreduce.job.reduces=2 #設置reduce task數目為1
SELECT url_id,log_time,log_type FROM behavior DISTRIBUTE BY url_id SORT BY user_id,log_time;
如果采用“ORDER BY”,HQL語句如下:
SELECT url_id,log_time,log_type FORM behavior ORDER BY user_id,log_time;
以上兩種方式最終結果如下圖所示:
二.HQL應用案例
為了方便大家更系統的了解HQL的使用方式,這里將給出一個綜合案例-汪涵的用戶訪問日志分析系統。背景如下:某個網站每天產生大量用戶訪問行為數據,這些行為數據包含的字段與我們前面描述的一直,如何使用Hive構建一個數據倉庫洗,能夠從國家和時間(天,月和年為時間粒度)兩個緯度產生網站的pv,uv等報表數據。
為了提高數據處理效率,我們采用了分區表和列式存儲兩種優化技巧:
分區表:以國家和時間(以天為單位)兩個緯度創建分區表,這樣,當統計某個國家或時間端內數據時,只需要掃描對應分區中的數據(忽略索引),大大提高性能。
列式存儲:考慮到絕大部分情況下,HQL語句只會用到若干列數據,為了避免不必要的磁盤IO,我們采用列式存儲格式存儲數據,比如ORC或Parquet。
構建用戶訪問日志分析系統的主要流程如下圖所示:
(1)ETL(Extract Transform Load)。用戶描述將數據從來源端經過抽取(extract),轉化(transform),加載(load)至目的端的過程。其中抽取主要功能是從原始文本解析處需要的數據,並對不合要求的數據進行清洗和轉換,包括: 不符合要求的數據是完整的數據,錯誤的數據,重復的數據。 不一致的數據,數據粒度的轉換,以及一些商務規划的計算。 在實例中,原始日志數據經抽取和轉換(可選用Python語言,使用Hadoop Streaming實現)后,變為以下結構化數據: 1999/01/12 10:12,se,254,www.google.com/f5,www.yahoo.com/soeos,564.746.582.215 1999/01/12 10:12,de,465,www.google.com/h5,www.yahoo.com/agvne,685.631.592.264 ...... 之后加載到數據表page_view中,該數據表的創建方式我們上面以及做過介紹了,這里不再贅述。 每天產生的原始數據行為數據經ETL后,以"PageViewData_<date>.csv"(<date>表示當前的日期)命名方式存到/tmp目錄下,並通過以下DML語句加載到數據表page_view(以文本文件作為的存儲格式)中: LOAD DATA INPATH "/tem/PageViewData_19990112.csv" INTO TABLE page_view; (2)創建ORC分區表,並加載數據。為了加快數據處理速度,我們以國家和和時間(以天為單位)兩個度量創建ORC分區表orc_page_view,對應的DDL語句如下所示: hive> CREATE TABLE orc_page_view( > view_time STRING, > userid STRING, > page_url STRING, > referrer_url STRING, > ip STRING) > PARTITIONED BY (vd STRING,country STRING) > STORED AS ORC; OK Time taken: 0.144 seconds hive> 由於分區字段vd(View Data)和country會出現在數據存放的目錄中,所以無需在放在數據表對應的字段列表中。 創建完ORC分區表后,采用以下DDL語句將page_view表中的數據加載到新表orc_page_view中,數據是1999年1月15日產生的來自四個國家(us:美國,de:德國)的用戶訪問日志: hive> FROM page_view pv > INSERT OVERWRITE TABLE orc_page_view > PARTITION (vd = '19990115', country = 'us') > SELECT view_time,userid,page_url,referrer_url,ip WHERE pv.view_time LIKE '1999/01/15%' AND pv.country = 'us' > INSERT OVERWRITE TABLE orc_page_view > PARTITION (vd = '19990115', country = 'de') > SELECT view_time,userid,page_url,referrer_url,ip WHERE pv.view_time LIKE '1999/01/15%' AND pv.country = 'de';
(3)數據查詢。使用HQL產生1999年1月15日的報表:
SELECT country,count(userid) FROM page_view WHERE view_time = "19990115" GROUP BY country;
用戶可講HQL產生的結果寫入MySQL數據庫,以便前段可視化展示。
以上三個步驟是不斷迭代進行的,將每天的數據存入ORC分區表orc_page_view中,進而可以獲取某一段時間的統計報表。

hive> FROM page_view pv
> INSERT OVERWRITE TABLE orc_page_view
> PARTITION (vd = '19990115', country = 'us')
> SELECT view_time,userid,page_url,referrer_url,ip WHERE pv.view_time LIKE '1999/01/15%' AND pv.country = 'us'
> INSERT OVERWRITE TABLE orc_page_view
> PARTITION (vd = '19990115', country = 'de')
> SELECT view_time,userid,page_url,referrer_url,ip WHERE pv.view_time LIKE '1999/01/15%' AND pv.country = 'de';
Query ID = root_20190520145050_bc6612ae-b276-4455-8784-d24d59e3b584
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1552552068924_7045, Tracking URL = http://storage101.aggrx:8088/proxy/application_1552552068924_7045/
Kill Command = /opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/hadoop/bin/hadoop job -kill job_1552552068924_7045
Hadoop job information for Stage-2: number of mappers: 1; number of reducers: 0
2019-05-20 14:50:48,769 Stage-2 map = 0%, reduce = 0%
2019-05-20 14:50:55,115 Stage-2 map = 100%, reduce = 0%, Cumulative CPU 4.56 sec
MapReduce Total cumulative CPU time: 4 seconds 560 msec
Ended Job = job_1552552068924_7045
Stage-5 is selected by condition resolver.
Stage-4 is filtered out by condition resolver.
Stage-6 is filtered out by condition resolver.
Stage-11 is selected by condition resolver.
Stage-10 is filtered out by condition resolver.
Stage-12 is filtered out by condition resolver.
Moving data to: hdfs://storage-ha/user/hive/warehouse/test.db/orc_page_view/vd=19990115/country=us/.hive-staging_hive_2019-05-20_14-50-35_046_58667942699678678-1/-ext-10000
Moving data to: hdfs://storage-ha/user/hive/warehouse/test.db/orc_page_view/vd=19990115/country=de/.hive-staging_hive_2019-05-20_14-50-35_046_58667942699678678-1/-ext-10002
Loading data to table test.orc_page_view partition (vd=19990115, country=us)
Loading data to table test.orc_page_view partition (vd=19990115, country=de)
Partition test.orc_page_view{vd=19990115, country=us} stats: [numFiles=1, numRows=1, totalSize=733, rawDataSize=488]
Partition test.orc_page_view{vd=19990115, country=de} stats: [numFiles=1, numRows=5, totalSize=1035, rawDataSize=2465]
MapReduce Jobs Launched:
Stage-Stage-2: Map: 1 Cumulative CPU: 4.56 sec HDFS Read: 8269 HDFS Write: 1965 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 560 msec
OK
Time taken: 23.25 seconds
hive>

hive> SELECT country,count(userid) FROM page_view WHERE view_time = "19990115" GROUP BY country; Query ID = root_20190520145959_a5af9c6d-1704-4494-bbb1-22d020badc36 Total jobs = 1 Launching Job 1 out of 1 Number of reduce tasks not specified. Estimated from input data size: 1 In order to change the average load for a reducer (in bytes): set hive.exec.reducers.bytes.per.reducer=<number> In order to limit the maximum number of reducers: set hive.exec.reducers.max=<number> In order to set a constant number of reducers: set mapreduce.job.reduces=<number> Starting Job = job_1552552068924_7048, Tracking URL = http://storage101.aggrx:8088/proxy/application_1552552068924_7048/ Kill Command = /opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/hadoop/bin/hadoop job -kill job_1552552068924_7048 Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1 2019-05-20 14:59:59,869 Stage-1 map = 0%, reduce = 0% 2019-05-20 15:00:07,174 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 4.41 sec 2019-05-20 15:00:16,563 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 7.87 sec MapReduce Total cumulative CPU time: 7 seconds 870 msec Ended Job = job_1552552068924_7048 MapReduce Jobs Launched: Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 7.87 sec HDFS Read: 10803 HDFS Write: 0 SUCCESS Total MapReduce CPU Time Spent: 7 seconds 870 msec OK Time taken: 38.087 seconds hive>
博主推薦閱讀:Hive快速入門篇之HQL的基礎語法(https://www.cnblogs.com/yinzhengjie/p/9154339.html)。