準備資料 語句
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...