Impala Join型別介紹

2021-09-26 09:49:56 字數 3636 閱讀 3839

多表關聯是在資料分析中非常常見的乙個操作,impala作為乙個ad-hoc的查詢系統,也提供了多種join型別。本文將結合乙個簡單的例子,給大家介紹下各種join的特點。

首先,我們構建了兩個簡單的測試表:employee和department,並往這兩個表中分別插入了若干條資料,如下所示:

為了驗證效果,我們故意往employee表中插入了幾條dept_id為0的資料,表示該雇員不屬於任何部門。資料已經構造完畢,下面我們就一一介紹每種join的特點。

這是最常見的join方式,其中inner關鍵字可以省略不寫,效果與join等同。這種join型別,只有當左右表中,都能匹配上的時候,才會輸出結果,我們使用如下的sql進行測試:

select id,name,depart_name from employee inner join department

on employee.dept_id = department.depart_id;

結果如下所示:

我們可以看到,employee表中沒有分配部門(dept_id=0)的雇員以及department表中沒有分配雇員的部門,都沒有輸出在結果中。

這種join也屬於比較常見的一種,其中outer關鍵字可以省略不寫。該join會將左表中的所有記錄都輸出,即使右邊中沒有與之匹配的結果,我們使用如下的sql進行測試:

我們從輸出的結果可以看到,在employee表中,即使雇員沒有分配部門,在這種join型別下也會被輸出,而相應的右表資料則會直接顯示為null。

這種join方式剛好與left相反,會將右邊中所有的記錄輸出,即使沒有在左表中匹配到相應的記錄,我們使用如下的sql進行測試:

我們可以從輸出結果看到,即使部門沒有分配雇員,仍然會輸出,相應左表的資料都會顯示為null。

這種join方式就相當於left join和right join的集合體,會將兩邊所有的資料都進行join,然後輸出,包括左右表中沒有匹配的記錄,我們通過如下sql進行測試:

我們可以看到,無論是沒有分配部門的雇員,還是沒有分配雇員的部門,都輸出在結果集當中,而對應的沒有匹配到的列,資料都顯示為null。

這種join是相對使用比較少的join型別,需要與left/right結合使用。例如,如果我們使用left semi join的話,那就只會返回左表中匹配到的資料(注意這裡與left outer join的區別),我們使用如下的sql進行測試:

left semi join與right semi join的結果,分別如下的左圖和右圖所示,結合sql我們可以發現,left semi join其實就是只返回left outer join中,左表的資料,right semi join也是同樣的道理。需要注意的是,我們在使用left semi join的時候,無法select右表的列,否則sql會報錯,如下的sql會直接返回失敗:

select id,name,depart_name from employee left semi join department

on employee.dept_id = department.depart_id;

這種join方式與semi-join一樣,都是只返回一張表的結果,但是返回的是不匹配的結果,即取反的結果。例如,left anti join返回的是左表中,沒有在右表匹配到的記錄,這裡解釋起來比較繞,我們直接看這個例子:

我們可以看到,對於left anti join返回的結果,是對於left semi join的取反結果,即返回的是沒有分配部門的雇員。

由於自然連線一般結果集非常大,所以impala為了避免這種情況,不支援使用natural join,如果我們直接使用如下的sql:

select id,name,depart_name from employee natural join department

on employee.dept_id = department.depart_id;

會直接返回失敗,這是由於impala會將natural當成是表employee的別名。如果說我們確實需要使用自然連線,可以使用corss join,如下所示:

需要注意的是,當我們使用corss join的時候,就不能再加關鍵字on,否則sql會直接報錯。

NSDate型別介紹

1 當前時間建立nsdate nsdate mydate nsdate date 很重要 nslog mydate mydate 2 從現在開始的24小時 nstimeinterval secondsperday 24 60 60 nsdate tomorrow nsdate datewithtim...

Redis Sorted Set型別介紹

sorted set是redis的一種資料型別,與set型別和hash型別的混合相似。同set型別一樣,sorted set中的元素都是惟一的,不能重複的字作串元素。所以在某些場景下,sorted set型別同set型別一樣。但是set型別物件中元素是無序的,而sorted set型別物件中的每個元...

MIME型別介紹

多用途網際網路郵件擴充套件 mime,multipurpose internet mail extensions 是乙個網際網路標準,它擴充套件了電子郵件標準,使其能夠支援非ascii字元 二進位制格式附件等多種格式的郵件訊息。這個標準被定義在 rfc 2045,rfc 2046,rfc 2047,...