1. 程式人生 > >Hadoop Hive sql語法詳解3--DML 操作:元資料儲存

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_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[   CLUSTER BY col_list
  | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]

[LIMIT number]
•使用ALL和DISTINCT選項區分對重複記錄的處理。預設是ALL,表示查詢所有記錄。DISTINCT表示去掉重複的記錄

•Where 條件
•類似我們傳統SQL的where 條件
•目前支援 AND,OR ,0.9版本支援between
•IN, NOT IN
•不支援EXIST ,NOT EXIST
ORDER BY與SORT BY的不同
•ORDER BY 全域性排序,只有一個Reduce任務
•SORT BY 只在本機做排序

Limit

•Limit 可以限制查詢的記錄數
SELECT * FROM t1 LIMIT 5
•實現Top k 查詢
•下面的查詢語句查詢銷售記錄最大的 5 個銷售代表。
SET mapred.reduce.tasks = 1 
  SELECT * FROM test SORT BY amount DESC LIMIT 5

•REGEX Column Specification
SELECT 語句可以使用正則表示式做列選擇,下面的語句查詢除了 ds 和 hr 之外的所有列:
SELECT `(ds|hr)?+.+` FROM test

例如
按先件查詢
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)


2. 基於Partition的查詢

•一般 SELECT 查詢會掃描整個表,使用 PARTITIONED BY 子句建表,查詢就可以利用分割槽剪枝(input pruning)的特性
•Hive 當前的實現是,只有分割槽斷言出現在離 FROM 子句最近的那個WHERE 子句中,才會啟用分割槽剪枝

3.Join

Syntax
join_table: 
   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
•Hive 只支援等值連線(equality joins)、外連線(outer joins)和(left semi joins)。Hive 不支援所有非等值的連線,因為非等值連線非常難轉化到 map/reduce 任務

•LEFT,RIGHT和FULL OUTER關鍵字用於處理join中空記錄的情況
•LEFT SEMI JOIN 是 IN/EXISTS 子查詢的一種更高效的實現
•join 時,每次 map/reduce 任務的邏輯是這樣的:reducer 會快取 join 序列中除了最後一個表的所有表的記錄,再通過最後一個表將結果序列化到檔案系統
•實踐中,應該把最大的那個表寫在最後

join 查詢時,需要注意幾個關鍵點

只支援等值join
•SELECT a.* FROM a JOIN b ON (a.id = b.id)
•SELECT a.* FROM a JOIN b 
    ON (a.id = b.id AND a.department = b.department)
•可以 join 多於 2 個表,例如
  SELECT a.val, b.val, c.val FROM a JOIN b 
    ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

•如果join中多個表的 join key 是同一個,則 join 會被轉化為單個 map/reduce 任務
LEFT,RIGHT和FULL OUTER

例子
•SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)

•如果你想限制 join 的輸出,應該在 WHERE 子句中寫過濾條件——或是在 join 子句中寫
•容易混淆的問題是表分割槽的情況
• SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key) 
  WHERE a.ds='2010-07-07' AND b.ds='2010-07-07‘
•如果 d 表中找不到對應 c 表的記錄,d 表的所有列都會列出 NULL,包括 ds 列。也就是說,join 會過濾 d 表中不能找到匹配 c 表 join key 的所有記錄。這樣的話,LEFT OUTER 就使得查詢結果與 WHERE 子句無關
•解決辦法
•SELECT c.val, d.val FROM c LEFT OUTER JOIN d 
  ON (c.key=d.key AND d.ds='2009-07-07' AND c.ds='2009-07-07')

LEFT SEMI JOIN
•LEFT SEMI JOIN 的限制是, JOIN 子句中右邊的表只能在 ON 子句中設定過濾條件,在 WHERE 子句、SELECT 子句或其他地方過濾都不行

•SELECT a.key, a.value 
  FROM a 
  WHERE a.key in 
   (SELECT b.key 
    FROM B);
       可以被重寫為:
      SELECT a.key, a.val 
   FROM a LEFT SEMI JOIN b on (a.key = b.key)

UNION ALL
•用來合併多個select的查詢結果,需要保證select中欄位須一致

•select_statement UNION ALL select_statement UNION ALL select_statement ...

相關推薦

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

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語法5--HiveQL與SQL區別

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

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

Hadoop Hive基礎SQL語法(DML 操作:資料儲存)

2. DML操作:元資料儲存 hive不支援用insert語句一條一條的進行插入操作,也不支援update操作。資料是以load的方式載入到建立好的表中。資料一旦匯入就不可以修改。 DML包括:INSERT插入、UPDATE更新、DELETE刪除 •向

例題SQL語句-資料庫基本操作6-資料型別拓展

1.3 資料型別——列舉(enum) 1、從集合中選擇一個數據(單選) mysql> create table t8( -> name varchar(20), -> sex enum('男','女','保密')

例題SQL語句-資料庫基本操作7-資料型別拓展

| 1.6 資料型別——boolean MySQL不支援boolean型別,true和false在資料庫中對應1和0。 mysql> create table t15( -> field boolean -> ); Query

例題SQL語句-資料庫基本操作1

1.1 連線伺服器 通過命令列面板連線 host:主機 -h username:使用者名稱 -u password:密碼 -p port:埠 -P 多學一招:如果MySQL伺服器在本地,IP

例題SQL語句-資料庫基本操作2

1.4 表的操作 1.4.1 顯示所有表 語法: show tables 1.4.2 建立表 語法: create table [if not exists] 表名( 欄位名 資料型別 [null|not null] [auto_in

例題SQL語句-資料庫基本操作4

1.6 SQL分類 DDL(data definition language)資料庫定義語言create、alter、drop、shop DML(data manipulation language)資料操縱語言select、update、ins

例題SQL語句-資料庫基本操作9-完整性介紹

| 1.15 資料完整性介紹 1.15.1 保證實體完整性 1、 主鍵約束 2、 唯一約束 3、 自動增長列 1.15.2 保證域完整性 1、 資料型別約束 2、 非空約束 3、 預設值約束 1.15.3

例題SQL語句-資料庫基本操作10-查詢語句

|版權宣告:本文為博主原創文章,未經博主允許不得轉載。轉載請附上原連結,部落格地址:https://blog.csdn.net/sgsgy5 1.6 查詢語句 語法:select [選項] 列名 [from 表名] [where 條件] [group by

例題SQL語句-資料庫基本操作11-排序分組聯合

| 1.6.11 order by排序 asc:升序【預設】 desc:降序 mysql> select * from stu order by ch desc; # 語文成績降序排列 mysql> select * from stu orde

Hive-0.13.1本地獨立模式安裝 資料儲存到MariaDB-10.1.0 Hadoop-2.4.0

tar -zxvf apache-hive-0.13.1-bin.tar.gz 解壓後,編輯java.sh(java.sh為自己建立的指令碼): vim /etc/profile.d/java.sh export HIVE_HOME=/opt/modules/hive/apache-hive-0.13.1

Hibernate學習之hql 與sql hql 語法

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

Python 3中的yield from語法

前言 最近在搗鼓Autobahn,它有給出個例子是基於asyncio 的,想著說放到pypy3上跑跑看竟然就……失敗了。 pip install asyncio直接報invalid syntax,粗看還以為2to3處理的時 候有問題——這不能怪我,好~多package都是用