Hive之 Hql語法解析
Hive 是基於Hadoop 構建的一套資料倉儲分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料,可以將結構
化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行,透過自己的SQL 去查詢分析需
要的內容,這套SQL 簡稱Hive SQL,使不熟悉mapreduce 的使用者很方便的利用SQL 語言查詢,彙總,分析資料。而mapreduce開發人員可以把
己寫的mapper 和reducer 作為外掛來支援Hive 做更復雜的資料分析。
它與關係型資料庫的SQL 略有不同,但支援了絕大多數的語句如DDL、DML 以及常見的聚合函式、連線查詢、條件查詢。HIVE不適合用於聯機
online)事務處理,也不提供實時查詢功能。它最適合應用在基於大量不可變資料的批處理作業。
HIVE的特點:可伸縮(在Hadoop的叢集上動態的新增裝置),可擴充套件,容錯,輸入格式的鬆散耦合。
Hive 的官方文件中對查詢語言有了很詳細的描述,請參考: ,本文的內容大部分翻譯自該頁面,期間加入了一些在使用過程中需要注意到的事項。
1. DDL 操作
建表:
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
建立簡單表:
hive> CREATE TABLE pokes (foo INT, bar STRING);
建立外部表:
建分割槽表
建Bucket表
建立表並建立索引欄位ds
hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
複製一個空表
例子
create table user_info (user_id int, cid string, ckid string, username string)
row format delimited
fields terminated by '\t'
lines terminated by '\n';
匯入資料表的資料格式是:欄位之間是tab鍵分割,行之間是斷行。
及要我們的檔案內容格式:
100636 100890 c5c86f4cddc15eb7 yyyvybtvt
100612 100865 97cc70d411c18b6f gyvcycy
100078 100087 ecd6026a15ffddf5 qa000100
顯示所有表:
hive> SHOW TABLES;
按正條件(正規表示式)顯示錶,
hive> SHOW TABLES '.*s';
修改表結構
表新增一列 :
hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
新增一列並增加列欄位註釋
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
更改表名:
hive> ALTER TABLE events RENAME TO 3koobecaf;
刪除列:
hive> DROP TABLE pokes;
增加、刪除分割槽
重新命名錶
修改列的名字、型別、位置、註釋:
表新增一列 :
hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
新增一列並增加列欄位註釋
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
增加/更新列
增加表的後設資料資訊
改變表檔案格式與組織
建立/刪除檢視
建立資料庫
顯示命令
2. DML 操作:後設資料儲存
hive不支援用insert語句一條一條的進行插入操作,也不支援update操作。資料是以load的方式載入到建立好的表中。資料一旦匯入就不可以修改。
向資料表內載入檔案
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
載入本地資料,同時給定分割槽資訊
例如:載入本地資料,同時給定分割槽資訊:
載入DFS資料 ,同時給定分割槽資訊:
hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
The above command will load data from an HDFS file/directory to the table. Note that loading data from HDFS will result in moving the file/directory. As a result, the operation is almost instantaneous.
OVERWRITE
將查詢結果插入Hive表
將查詢結果寫入HDFS檔案系統
INSERT INTO
3. DQL 操作:資料查詢SQL
3.1 基本的Select 操作
SELECT * FROM test SORT BY amount DESC LIMIT 5
例如
按先件查詢
hive> SELECT a.foo FROM invites a WHERE a.ds='<DATE>';
將查詢資料輸出至目錄:
hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>';
將查詢結果輸出至本地目錄:
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;
選擇所有列到本地目錄 :
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds='<DATE>';
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;
將一個表的統計結果插入另一個表中:
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;
hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
JOIN
hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;
將多表資料插入到同一表中:
FROM src
INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;
將檔案流直接插入檔案:
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';
This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduce side (please see the Hive Tutorial or examples)
3.2 基於Partition的查詢
3.3 Join
table_reference JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition
table_reference:
table_factor
| join_table
table_factor:
tbl_name [alias]
| table_subquery alias
| ( table_references )
join_condition:
ON equality_expression ( AND equality_expression )*
equality_expression:
expression = expression
ON (a.id = b.id AND a.department = b.department)
ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
WHERE a.ds='2010-07-07' AND b.ds='2010-07-07‘
ON (c.key=d.key AND d.ds='2009-07-07' AND c.ds='2009-07-07')
FROM a
WHERE a.key in
(SELECT b.key
FROM B);
FROM a LEFT SEMI JOIN b on (a.key = b.key)
4. 從SQL到HiveQL應轉變的習慣
1、Hive不支援等值連線
SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2 WHERE t1.a2 = t2.b2
2、分號字元
3、IS [NOT] NULL
4、Hive不支援將資料插入現有的表或分割槽中,
僅支援覆蓋重寫整個表,示例如下:
- INSERT OVERWRITE TABLE t1
- SELECT * FROM t2;
4、hive不支援INSERT INTO, UPDATE, DELETE操作
這樣的話,就不要很複雜的鎖機制來讀寫資料。
INSERT INTO syntax is only available starting in version 0.8。INSERT INTO就是在表或分割槽中追加資料。
5、hive支援嵌入mapreduce程式,來處理複雜的邏輯
如:
- FROM (
- MAP doctext USING 'python wc_mapper.py' AS (word, cnt)
- FROM docs
- CLUSTER BY word
- ) a
- REDUCE word, cnt USING 'python wc_reduce.py';
--doctext: 是輸入
--word, cnt: 是map程式的輸出
--CLUSTER BY: 將wordhash後,又作為reduce程式的輸入
並且map程式、reduce程式可以單獨使用,如:
- FROM (
- FROM session_table
- SELECT sessionid, tstamp, data
- DISTRIBUTE BY sessionid SORT BY tstamp
- ) a
- REDUCE sessionid, tstamp, data USING 'session_reducer.sh';
--DISTRIBUTE BY: 用於給reduce程式分配行資料
6、hive支援將轉換後的資料直接寫入不同的表,還能寫入分割槽、hdfs和本地目錄。
這樣能免除多次掃描輸入表的開銷。
- FROM t1
- INSERT OVERWRITE TABLE t2
- SELECT t3.c2, count(1)
- FROM t3
- WHERE t3.c1 <= 20
- GROUP BY t3.c2
- INSERT OVERWRITE DIRECTORY '/output_dir'
- SELECT t3.c2, avg(t3.c1)
- FROM t3
- WHERE t3.c1 > 20 AND t3.c1 <= 30
- GROUP BY t3.c2
- INSERT OVERWRITE LOCAL DIRECTORY '/home/dir'
- SELECT t3.c2, sum(t3.c1)
- FROM t3
- WHERE t3.c1 > 30
- GROUP BY t3.c2;
5. 實際示例
建立一個表
CREATE TABLE u_data (
userid INT,
movieid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '/t'
STORED AS TEXTFILE;
下載示例資料檔案,並解壓縮
wget
tar xvzf ml-data.tar__0.gz
載入資料到表中:
LOAD DATA LOCAL INPATH 'ml-data/u.data'
OVERWRITE INTO TABLE u_data;
統計資料總量:
SELECT COUNT(1) FROM u_data;
現在做一些複雜的資料分析:
建立一個 weekday_mapper.py: 檔案,作為資料按周進行分割
import sys
import datetime
for line in sys.stdin:
line = line.strip()
userid, movieid, rating, unixtime = line.split('/t')
生成資料的周資訊
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print '/t'.join([userid, movieid, rating, str(weekday)])
使用對映指令碼
//建立表,按分割符分割行中的欄位值
CREATE TABLE u_data_new (
userid INT,
movieid INT,
rating INT,
weekday INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '/t';
//將python檔案載入到系統
add FILE weekday_mapper.py;
將資料按周進行分割
INSERT OVERWRITE TABLE u_data_new
SELECT
TRANSFORM (userid, movieid, rating, unixtime)
USING 'python weekday_mapper.py'
AS (userid, movieid, rating, weekday)
FROM u_data;
SELECT weekday, COUNT(1)
FROM u_data_new
GROUP BY weekday;
處理Apache Weblog 資料
將WEB日誌先用正規表示式進行組合,再按需要的條件進行組合輸入到表中
add jar ../build/contrib/hive_contrib.jar;
CREATE TABLE apachelog (
host STRING,
identity STRING,
user STRING,
time STRING,
request STRING,
status STRING,
size STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|//[[^//]]*//]) ([^ /"]*|/"[^/"]*/") (-|[0-9]*) (-|[0-9]*)(?: ([^ /"]*|/"[^/"]*/") ([^ /"]*|/"[^/"]*/"))?",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
STORED AS TEXTFILE;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2145122/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HIVE基本語法以及HIVE分割槽Hive
- 3- hive語法Hive
- Hive sql語法詳解HiveSQL
- Hive語法及其進階(二)Hive
- Presto 與 Hive 語法學習RESTHive
- 數倉工具—Hive語法之map join、reduce join、smb join(8)Hive
- 語法解析器續:case..when..語法解析計算
- Smali 語法解析 —— 類
- Xpath解析及其語法
- Hive基礎語法5分鐘速覽Hive
- Nginx Location 指令語法解析Nginx
- Smali 語法解析——Hello World
- 淺談Kotlin語法篇之Lambda表示式完全解析(六)Kotlin
- Dart語法篇之集合的使用與原始碼解析(二)Dart原始碼
- Hive原始碼解析Hive原始碼
- Hive內部函式簡介及查詢語法Hive函式
- 引言:分詞與語法解析分詞
- Dart語法篇之基礎語法(一)Dart
- SSH框架控制檯輸出HQL語句和SQL語句的方法框架SQL
- gRPC之proto語法RPC
- 1.分詞與語法解析分詞
- MogDB/openGauss中merge的語法解析
- Flume和Hive整合之hive sinkHive
- 關於Hibernate和hql語句的相關知識點
- 淺談Kotlin語法篇之基礎語法(一)Kotlin
- React原始碼解析(1):jsx語法是如何解析React原始碼JS
- Go 語言的詞法分析和語法分析(2)—Import宣告的解析Go詞法分析語法分析Import
- Drools之基礎語法
- Hive學習之Hive的安裝Hive
- hibernate中hql查詢
- array+map+struct.hqlStruct
- JavaScript 工作原理之十四-解析,語法抽象樹及最小化解析時間的 5 條小技巧JavaScript抽象
- JavaSE之java基礎語法Java
- Python 語法之裝飾器Python
- selenium之xpath語法總結
- Python爬蟲之XPath語法Python爬蟲
- Java高階語法之反射Java反射
- HIVE學習之(三)Hive
- SQL-Hive中的Select From解析SQLHive