1. 程式人生 > >Hadoop Hive sql語法詳解5--HiveQL與SQL區別

Hadoop Hive sql語法詳解5--HiveQL與SQL區別

1.hive內聯支援什麼格式?
2.分號字元注意什麼問題?
3.hive中empty是否為null?
4.hive是否支援插入現有表或則分割槽中?
5.hive是否支援INSERT INTO 表 values()?


1、Hive不支援等值連線 

•SQL中對兩表內聯可以寫成:
•select * from dual a,dual b where a.key = b.key;
•Hive中應為
•select * from dual a join dual b on a.key = b.key; 
而不是傳統的格式:
SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2
WHERE t1.a2 = t2.b2


2、分號字元
•分號是SQL語句結束標記,在HiveQL中也是,但是在HiveQL中,對分號的識別沒有那麼智慧,例如:
•select concat(key,concat(';',key)) from dual;
•但HiveQL在解析語句時提示:
        FAILED: Parse Error: line 0:-1 mismatched input '<EOF>' expecting ) in function specification
•解決的辦法是,使用分號的八進位制的ASCII碼進行轉義,那麼上述語句應寫成:
•select concat(key,concat('\073',key)) from dual;


3、IS [NOT] NULL
•SQL中null代表空值, 值得警惕的是, 在HiveQL中String型別的欄位若是空(empty)字串, 即長度為0, 那麼對它進行IS NULL的判斷結果是False.

4、Hive不支援將資料插入現有的表或分割槽中,
僅支援覆蓋重寫整個表,示例如下:
  1. INSERT OVERWRITE TABLE t1  
  2. SELECT * FROM t2;
複製程式碼

5、hive不支援INSERT INTO 表 Values(), UPDATE, DELETE操作
    這樣的話,就不要很複雜的鎖機制來讀寫資料。
    INSERT INTO syntax is only available starting in version 0.8。INSERT INTO就是在表或分割槽中追加資料。


6、hive支援嵌入mapreduce程式,來處理複雜的邏輯
如:
  1. FROM (  
  2. MAP doctext USING 'python wc_mapper.py' AS (word, cnt)  
  3. FROM docs  
  4. CLUSTER BY word  
  5. ) a  
  6. REDUCE word, cnt USING 'python wc_reduce.py';  
複製程式碼

--doctext: 是輸入
--word, cnt: 是map程式的輸出

--CLUSTER BY: 將wordhash後,又作為reduce程式的輸入



並且map程式、reduce程式可以單獨使用,如:
  1. FROM (  
  2. FROM session_table  
  3. SELECT sessionid, tstamp, data  
  4. DISTRIBUTE BY sessionid SORT BY tstamp  
  5. ) a  
  6. REDUCE sessionid, tstamp, data USING 'session_reducer.sh';  
複製程式碼

-DISTRIBUTE BY: 用於給reduce程式分配行資料

7、hive支援將轉換後的資料直接寫入不同的表,還能寫入分割槽、hdfs和本地目錄
這樣能免除多次掃描輸入表的開銷。
  1. FROM t1  
  2. INSERT OVERWRITE TABLE t2  
  3. SELECT t3.c2, count(1)  
  4. FROM t3  
  5. WHERE t3.c1 <= 20  
  6. GROUP BY t3.c2  
  7. INSERT OVERWRITE DIRECTORY '/output_dir'  
  8. SELECT t3.c2, avg(t3.c1)  
  9. FROM t3  
  10. WHERE t3.c1 > 20 AND t3.c1 <= 30  
  11. GROUP BY t3.c2  
  12. INSERT OVERWRITE LOCAL DIRECTORY '/home/dir'  
  13. SELECT t3.c2, sum(t3.c1)  
  14. FROM t3  
  15. WHERE t3.c1 > 30  
  16. GROUP BY t3.c2;  
複製程式碼
實際例項

建立一個表
CREATE TABLE u_data (
userid INT,
movieid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '/t'
STORED AS TEXTFILE;

下載示例資料檔案,並解壓縮
wget http://www.grouplens.org/system/files/ml-data.tar__0.gz
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;

相關推薦

Hadoop Hive sql語法5--HiveQLSQL區別

1.hive內聯支援什麼格式?2.分號字元注意什麼問題?3.hive中empty是否為null? 4.hive是否支援插入現有表或則分割槽中? 5.hive是否支援INSERT INTO 表 values()? 1、Hive不支援等值連線 •SQL中對兩表內聯可以寫成:•s

008-Hadoop Hive sql語法3-DML 操作:元數據存儲

pan 查詢 寫入 所有 not insert語句 int 寫入文件 文件系統 一、概述 hive不支持用insert語句一條一條的進行插入操作,也不支持update操作。數據是以load的方式加載到建立好的表中。數據一旦導入就不可以修改。 DML包括:INSERT插入

017-Hadoop Hive sql語法7-去重排序、數據傾斜

col 去重排序 sel cluster 可能 更多 分發 指定 clust 一、數據去重排序 1.1、去重   distinct與group by   盡量避免使用distinct進行排重,特別是大表操作,用group by代替   -- 不建議 selec

016-Hadoop Hive sql語法6-job輸入輸出優化、數據剪裁、減少job數、動態分區

分享 hive table 取數 nbsp put union 正在 style 一、job輸入輸出優化 善用muti-insert、union all,不同表的union all相當於multiple inputs,同一個表的union all,相當map一次輸出多條

Hadoop Hive sql語法

Hive 是基於Hadoop 構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行,通過自己的SQL

Hadoop Hive sql語法3--DML 操作:元資料儲存

轉載自:http://www.aboutyun.com/thread-7326-1-1.html 1 基本的Select 操作 SELECT [ALL | DISTINCT] select_expr, select_expr, ...FROM table_referenc

Hadoop Hive sql語法1-認識hive及DDL操作

轉載自:http://www.aboutyun.com/thread-7324-1-1.html 1.認識hive:Hive 是基於Hadoop 構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料,可以將結構化的資料檔

Hive sql語法

1.  DDL 操作 DDL •建表 •刪除表 •修改表結構 •建立/刪除檢視 •建立資料庫 •顯示命令 建表: CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name    [(col_name data_type [COMMENT

DockerFile 編譯語法(5)

出錯 copyright urg argument 容器 註意 例子 cmd 格式 title: DockerFile 編譯語法詳解(5) date: 2018-12-16 16:53:20 tags: Docker categories: Docker copyrig

quartz5-quartzspring結合

1. spring中quartz依賴 2. quartz配置作業的兩種方式及配置檔案 慕課網_《Java定時任務排程工具詳解之Quartz篇》學習總結 1. spring中quartz依賴

【Boost】boost庫asio2——strandio_service區別

[cpp] view plain copy  print? namespace {       // strand提供序列執行, 能夠保證執行緒安全, 同時被post或dispatch的方法, 不會被併發的執行.      // io_service不能保證

mysql-5.7.9 shutdown 語法

resp 登錄 ive conn denied 權限不足 這樣的 fec comm mysql-5.7.9 終於提供shutdown 語法啦:   之前如果想關閉一個mysql數據庫可以通過kill 命令、mysqladmin shutdown 、service mysql

Hibernate學習之hql sql hql 語法

Hibernate中查詢:     createQuery( String qlString)使用的是HQL語句;     createNativeQuery (String sqlString)使用的是SQL語句;   關係HQL與SQL區別:    hql 語法詳解:   

Thinking in BigData(八)大資料Hadoop核心架構HDFS+MapReduce+Hbase+Hive內部機理

      純乾貨:Hadoop核心架構HDFS+MapReduce+Hbase+Hive內部機理詳解。       通過這一階段的調研總結,從內部機理的角度詳細分析,HDFS、MapReduce、Hbase、Hive是如何執行,以及基於Hadoop資料倉庫的構建和分散式資

Oracle create tablespace 創建表空間語法

系統回滾段 語法 判斷 臨時 extent 數值 off offline 文件的 CREATE [UNDO] TABLESPACE tablespace_name [DATAFILE datefile_spec1 [,datefile_spec2] ..

hadoop生態圈的

hadoop生態圈 hadoop學習線路 hadoop件組 hadoop 學習和使用hadoop有一年了,這裏主要分享一下對hadoop整體上的理解,分門別類的介紹一下相關組件,最後提供了建議的學習路線,希望對hadoop的初學者有參考作用。 1. Hadoop核心件組有哪些? 廣義

Hive UDAF開發

-s 聚合 而且 pri ros cal 關系 方法調用 evaluator 明這篇文章是來自Hadoop Hive UDAF Tutorial - Extending Hive with Aggregation Functions:的不嚴格翻譯,因為翻譯的文章示例寫得比較

[持續交付實踐] pipeline:pipeline 使用之語法

安裝工具 詳細 href 3.0 def 實現 能夠 action roo 一、引言 jenkins pipeline語法的發展如此之快用日新月異來形容也不為過,而目前國內對jenkins pipeline關註的人還非常少,相關的文章更是稀少,唯一看到w3c有篇相關的估計是

SQL*Loader

相關 let 最後登錄 bus repl () database eve res 在 Oracle 數據庫中,我們通常在不同數據庫的表間記錄進行復制或遷移時會用以下幾種方法:1. A 表的記錄導出為一條條分號隔開的 insert 語句,然後執行插入到 B 表中2. 建立數據

Nginx Rewrite語法

服務器端 .html use rgs args port 資源 如果 urn 重寫中用到的指令 if (條件) {} 設定條件,再進行重寫 set #設置變量 return #返回狀態碼 break #跳出rewrite rewrite #重寫 If 語法格式 If