Hive Hive中表連線的優化,加快查詢速度

2021-08-23 14:17:42 字數 1393 閱讀 7316

1、多表連線的執行順序和mapreduce job優化

select

a.ymd

,a.price_close

,b.price_close

,c.price_close

from stocks a join stocks b on a.ymd = b.ymd

join stocks c on a.ymd = c.ymd

大多數情況下hive會對每對 join 連線物件啟動乙個mapreduce任務。上例中會首先啟動乙個mapreduce job對錶 a 和表 b 進行連線操作,

然後會啟動乙個mapreuce job將第乙個mapreduce job的輸出和表 c 進行連線操作。

當對3個或者更多個表進行 join 連線時,如果每個 on 子句都使用相同的連線鍵的話,那麼只會產生乙個 map reduce job。

即hive通過乙個優化可以在同乙個map reduce job 中連線多個表(需要每個子句中有相同的連線鍵)。

2、join連線時表的順序(內連線)

hive假定查詢中最後乙個表是最大的那個表,在對每行記錄進行連線操作時,它會嘗試將其他表快取起來,然後掃瞄最後那個表進行計算。

因此使用者需要保證連續查詢中表的大小從左往右是依次增加的。

使用者也可以人為顯示告訴查詢優化器哪張表是大表,即使它在查詢中不是位於最後面的,使用方式如下:

select /*+streamtable(s)*/s.ymd, s.symbol,s.price_close,d.dividend

from stocks s join dividends d on s.ymd = d.ymd and s.symbol = d.symbol

3、連線前通過where過濾資料加快查詢資料

最直接了當的方式是使用巢狀select語句:

select 

s.ymd,s.symbol,s.price_close,d.dividends

from

(select * from stocks

where symbol = 'aapl' and exchange = 'nasdaq'

)sleft outer join

(select * from dividends

where symbol = 'aapl' and exchange = 'nasdaq'

)don s.ymd = d.ymd

set hive.auto.convert.join=true; --讓hive在必要的時候啟動優化

hive.mapjoin.smalltable.filesize=25000000; --設定能夠使用這個優化的小表的大小(單位是位元組)

Hive Hive中表建立方式及其對比

首先就是最常見的方式,通create table方式進行建立hive表 例如?create external table if not exists tablename column columntype comment annotation column columntype comment an...

SQL中表的連線,LINQTOSQL中表的連線

表的連線分為,內連線與外連線。外連線分為左外連線,右外連線。左連線是已左邊表中的資料為基準,若左表有資料右表沒有資料,則顯示左表中的資料右表中的資料顯示為空 sql 內連線 select from a,b where a.aid b.aid a,b表連線,a,b中均有的資料才顯示 左外連線 sele...

beeline連線hive Hive行轉列詳解

孫悟空 白羊座 a 沙悟淨 射手座 a 宋鬆鬆 白羊座 b 豬八戒 白羊座 a 小鳳姐 射手座 a 轉換成以下格式 白羊座,a 孫悟空 豬八戒 白羊座,b 宋鬆鬆 射手座,a 沙悟淨 小鳳姐 知識點 concat string1,string2 string1和string2需要是列名 使用hive...