Hive JOIN實現過程

2021-06-14 17:15:44 字數 3284 閱讀 5287

準備資料 語句

select a.uid,a.name,b.age from logs a join users b on (a.uid=b.uid);

我們希望的結果是把users表join進來獲取age欄位。

hive> select * from logs;

oka蘋果5

a橙子3

b燒雞1

hive> select * from users;

oka23

b21hive> select a.uid,a.name,b.age from logs a join users b on (a.uid=b.uid);

a蘋果23

a橙子23

b燒雞21

key這裡後面的數字是tag,後面在reduce階段用來區分來自於那個表的資料。tag是附屬在key後面的。那為什麼會把a(0)和a(1)匯集在一起了呢,是因為對先對a求了hashcode,設在了hivekey上,所以同乙個key還是在一起的。

map階段只是拆分key和value。

reduce階段主要看它是如何把它合併起來了,從圖上可以直觀的看到,其實就是把tag=1的內容,都加到tag=0的後面,就是這麼簡單。

**實現上,就是先臨時用個變數把值儲存起來在storage裡面, storage(0) = [, ] storage(1) = ,當key變化(如a變為b)或全部結束時,會呼叫endgroup()方法,把內容合併起來。變成[, ]

ok//語法樹

abstract syntax tree:

(tok_query (tok_from (tok_join (tok_tabref (tok_tabname logs) a) (tok_tabref (tok_tabname users) b) (= (. (tok_table_or_col a) uid) (. (tok_table_or_col b) uid)))) (tok_insert (tok_destination (tok_dir tok_tmp_file)) (tok_select (tok_selexpr (. (tok_table_or_col a) uid)) (tok_selexpr (. (tok_table_or_col a) name)) (tok_selexpr (. (tok_table_or_col b) age)))))

//階段

stage dependencies:

stage-1 is a root stage

stage-0 is a root stage

stage plans:

stage: stage-1

map reduce

a tablescan //掃瞄表, 就只是一行一行的傳遞下去而已

alias: a

reduce output operator //輸出給reduce的內容

key expressions: // key啦,這裡的key是uid,就是我們寫在on子句那個,你可以試試加多幾個條件

expr: uid

type: string

sort order: + //排序

map-reduce partition columns://分割槽字段,貌似是和key一樣的

expr: uid

type: string

tag: 0 //用來區分這個key是來自哪個表的

value expressions: //reduce用到的value欄位

expr: uid

type: string

expr: name

type: string

b tablescan //掃瞄表, 就只是一行一行的傳遞下去而已

alias: b

reduce output operator //輸出給reduce的內容

key expressions: //key

expr: uid

type: string

sort order: +

map-reduce partition columns: //分割槽字段

expr: uid

type: string

tag: 1 //用來區分這個key是來自哪個表的

value expressions: //值

expr: age

type: int

reduce operator tree: // reduce階段

join operator // join的operator

condition map:

inner join 0 to 1 // 內連線0和1表

condition expressions: // 第0個表有兩個字段,分別是uid和name, 第1個表有乙個欄位age

0 1

handleskewjoin: false //是否處理傾斜join,如果是,會分為兩個mr任務

outputcolumnnames: _col0, _col1, _col6 //輸出字段

select operator //列裁剪(我們sql寫的select欄位)

expressions:

expr: _col0

type: string

expr: _col1

type: string

expr: _col6

type: int

outputcolumnnames: _col0, _col1, _col2

file output operator //把結果輸出到檔案

compressed: false

globaltableid: 0

table:

input format: org.apache.hadoop.mapred.textinputformat

output format: org.apache.hadoop.hive.ql.io.hiveignorekeytextoutputformat

stage: stage-0

fetch operator

limit: -1

可以看到裡面都是乙個個operator順序的執行下來

**:

Hive Join的實現原理

join hive執行引擎會將hql 翻譯 成為map reduce任務,如果多張表使用同一列做join則將被翻譯成乙個reduce,否則將被翻譯成多個map reduce任務。如 hive執行引擎會將hql 翻譯 成為map reduce任務,如果多張表使用同一列做join則將被翻譯成乙個redu...

hive join語法介紹

一 在多表查詢的時候,由於表與表之間有關聯性,所有hive提供了join的語法,基本類似sql的join語法。主要分為以下五類 1.內連線 join 2.外鏈結 outer join 3.半連線 left semi join 4.笛卡爾連線 cross join 5.其他連線方式 eg.mapjoi...

hive join語句優化

有兩種方法可以啟用它。1.是通過使用乙個注釋,mapjoin 小表 此c樣式注釋應放在select之後,它指示hive將別名 小表 載入到記憶體中。select mapjoin c from orders o join cities c on o.city id c.id 2.另一種開啟mapjoi...