場景九.減少IO次數(shù)
1)通過多表插入 FROM A INSERT B SELECT A,.... INSERT C SELECT A ...
2)一次輸入,多次使用 WITH TABLE AS (....)
1)通過多表插入 FROM A INSERT B SELECT A,.... INSERT C SELECT A ...
Hive支持多表插入,可以在同一個(gè)查詢中使用多個(gè)insert子句,這樣的好處是我們只需要掃描一遍源表就可以生成多個(gè)不相交的輸出!
例子 :
from test1
insert overwrite table test2
?partition (age)
select name,address,school,age
insert overwrite table test3
select name,address
多表插入的關(guān)鍵點(diǎn)在于將所要執(zhí)行查詢的表語句 "from 表名",放在最開頭位置。
注意 :
? ?這是一個(gè)優(yōu)化,可以減少表的掃描,從而減少 JOB 中 MR的 STAGE 數(shù)量,達(dá)到優(yōu)化的目的。
2)一次輸入,多次使用 WITH TABLE AS (....)
with介紹:
with as?也叫做子查詢部分,首先定義一個(gè)sql片段,該sql片段會被整個(gè)sql語句所用到,為了讓sql語句的可讀性更高些,作為提供數(shù)據(jù)的部分,也常常用在union等集合操作中。
with as就類似于一個(gè)視圖或臨時(shí)表,可以用來存儲一部分的sql語句作為別名,不同的是with as 屬于一次性的,而且必須要和其他sql一起使用才可以!
其最大的好處就是適當(dāng)?shù)奶岣叽a可讀性,而且如果with子句在后面要多次使用到,這可以大大的簡化SQL;更重要的是:一次分析,多次使用,這也是為什么會提供性能的地方,達(dá)到了“少讀”的目標(biāo)。
with使用:
WITH
t1 ?AS (
SELECT ?* ??FROM ? carinfo? ),?
t2 ?AS (
SELECT *?FROM car_blacklis? ? )
SELECT*
FROMt1, t2
注意:這里必須要整體作為一條sql查詢,即with as語句后不能加分號,不然會報(bào)錯(cuò)
with使用注意事項(xiàng):
1.、with子句必須在引用的select語句之前定義,同級with關(guān)鍵字只能使用一次,多個(gè)只能用逗號分割;最后一個(gè)with 子句與下面的查詢之間不能有逗號,只通過右括號分割,with 子句的查詢必須用括號括起來.
2、如果定義了with子句,但其后沒有跟select查詢,則會報(bào)錯(cuò)!
3、前面的with子句定義的查詢在后面的with子句中可以使用。但是一個(gè)with子句內(nèi)部不能嵌套with子句!
正確寫法:
with ?t1 ?as ?( ?select ?* ?from carinfo),
t2 ?as ( select ?t1.id ?from t1 )
select * from t2