1. 程式人生 > >Hive.LEFT SEMI JOIN子句

Hive.LEFT SEMI JOIN子句

        公司的資料倉庫和離線資料分析是建立在Hadoop + Hive基礎上的,現在的工作主要是資料分析,自然也就跟HQL查詢經常打交道了。剛來公司幾乎完全不懂資料庫知識,神馬結構化查詢語言也只是聽說而已,不過,這沒關係,實際工作一來,學習起來還是很快~~

        年前有一個同事叫幫忙查某個產品的月度留存UV這個資料,當時業務不熟,還去參照了一下別人是怎麼定義留存使用者這個指標的。。。然後根據自己的理解,用下面這種形式(其實剛開始的邏輯寫得比這個還拙計,我不會到處亂說)的指令碼邏輯去查:

SELECT
	t1.產品型別,
	COUNT(DISTINCT (IF(t2.使用者ID IS NULL, NULL, t1.使用者ID))) AS KEEP_UV
FROM
(
	SELECT
		產品型別,
		使用者ID
	FROM 事實表
	WHERE (`DATE` >= 20140201 AND `DATE` <= 20140228)
) t1
LEFT OUTER JOIN
(
	SELECT
		產品型別,
		使用者ID
	FROM 事實表
	WHERE (`DATE` >= 20140101 AND `DATE` <= 20140131)
) t2 ON (t1.產品型別 = t2.產品型別 AND t1.使用者ID = t2.使用者ID)
GROUP BY t1.產品型別
        

       但是,這個事實表本身所包含的欄位很多,資訊量很大,加上時間跨度為2個月,當時就想會不會略慢,結果跑起來果然慢得很,Map或者Reduce的任務經常卡在某個百分點比較久時間。

       看著MapReduce像蝸牛一樣行進著,我才忽然想到在官方Wiki上貌似看到過這種 IN / EXISTS子查詢(準確地說,這裡是非相關子查詢)有一種高效的實現,就是LEFT SEMI JOIN:

       LEFT SEMI JOIN implements the uncorrelated IN/EXISTS subquery semantics in an efficient way.

       於是抱著試一試的心態,馬上修改指令碼,用下面的形式去跑:

SELECT
	產品型別,
	COUNT(DISTINCT t1.使用者ID) AS KEEP_UV
FROM
(
	SELECT
		產品型別,
		使用者ID
	FROM 事實表
	WHERE (`DATE` >= 20140201 AND `DATE` <= 20140228)
) t1
LEFT SEMI JOIN
(
	SELECT
		產品型別,
		使用者ID
	FROM 事實表
	WHERE (`DATE` >= 20140101 AND `DATE` <= 20140131)
) t2 ON (t1.產品型別 = t2.產品型別 AND t1.使用者ID = t2.使用者ID)
GROUP BY 產品型別

       果然,第2種指令碼很快就出來結果了,而第1種指令碼還在某個百分點艱難地挪步。。。

       值得注意的是,用了LEFT SEMI JOIN子句以後,右邊的表在JOIN操作以外就不可見了,也就是說,右邊的表只能在對應的ON子句中被引用。
       以上只是直觀的感覺,從定性的層面感受到LEFT SEMI JOIN方式的效能真的是很不錯,不曉得這樣的效果除了來自Hive本身的官方高效實現外,與公司的生產環境有沒有關係。。。
       怎麼樣,是不是想看看Hive這種特有的方式究竟為我們的查詢帶來了多大的時間效能改進?是不是也想看看它在原始碼裡究竟是怎樣的實現?行動起來吧。

相關推薦

Hive.LEFT SEMI JOIN子句

        公司的資料倉庫和離線資料分析是建立在Hadoop + Hive基礎上的,現在的工作主要是資料分析,自然也就跟HQL查詢經常打交道了。剛來公司幾乎完全不懂資料庫知識,神馬結構化查詢語言也只是聽說而已,不過,這沒關係,實際工作一來,學習起來還是很快~~    

hiveleft semi join 講解

介紹LEFT SEMI JOIN (左半連線)是 IN/EXISTS 子查詢的一種更高效的實現。Hive 當前沒有實現 IN/EXISTS 子查詢,所以可以用 LEFT SEMI JOIN 重寫你的子查

left semi joinjoin 的區別

LEFT SEMI JOIN:左半開連線會返回左邊表的記錄,前提是其記錄對於右邊表滿足ON語句中的判定條件。對於常見的內連線(INNER JOIN),這是一個特殊的,優化了的情況。大多數的SQL方言會通過in.......exists結構來處理這種情況。 準備表: cre

hiveleft/right join on連線中and與where的使用問題

很多同學在進行表關聯的時候,and和where的使用有時候分不清,在這裡實操記錄下。 建立人員資訊表並寫入資料 create table tmp.userinfo(id string,name string,age string,dept string); insert into tmp.userinf

Hivejoin, outer join, semi join區別

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。 最常用的就是多表關聯查詢,主要講解下join、outer join和semi join的具體使用。

HIVE Left join 結果表為空的後果

我最近遇見了一個BUG  因為是在其他平臺跑的資料  也就是電信的大資料平臺  我使用的HQL指令碼  (因為只讓用這個 我也很尷尬)  跑出來的結果表 有兩張表沒有資料  。 最後去跟電信要log日誌  發現並沒有報錯

hive 各種 joinleft outer joinjoin、full outer join

一、概念 1、左連線 left outer join 以左邊表為準,逐條去右邊表找相同欄位,如果有多條會依次列出 2、連線join 找出左右相同同的記錄 3、全連線 full outer  join 包括兩個表的join結果,左邊在右邊中沒找到的結果(NULL),右邊在左邊

HIVE LEFT JOIN ON AND不支援非等值關聯解決辦法2

這個是在國外論壇找到的,這個方法可行----------------------------Origin SQL-------------------------------SELECT table1.id, table1.date_added, table2.date_ad

db2與hiveleft joinleft outer join的區別

db2中inner join沒有左右之分,outer join有左右之分,其目的在於需要確定以誰為主表; hive中不支援left join,支援left outer join; hive中left semi join作用類似於SQL中的in,以右表中的欄位(key )進

left outer join的on不起作用

oci join microsoft nbsp mysq soft sel asp msdn left outer join的on不起作用 https://msdn.microsoft.com/zh-cn/library/ms177634.aspx?f=255&am

Linq表連接大全(INNER JOINLEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN、CROSS JOIN)

iar value fsm wdcp esc max als tla plc 轉載http://www.cnblogs.com/shenqiboy/p/3260105.html 我們知道在SQL中一共有五種JOIN操作:INNER JOIN、LEFT OUTER JOIN、

MapReduce編程之Semi Join多種應用場景與使用

得出 mon comm exception strong 相關 path 區別 rep Map Join 實現方式一 ● 使用場景:一個大表(整張表內存放不下,但表中的key內存放得下),一個超大表 ● 實現方式:分布式緩存 ● 用法: SemiJoin就是所謂的半

Inner Join, Left Outer Join和Association的區別

outer 驗證 sta alt str 圖片 信息 class 能夠 測試用的CDS視圖的源代碼,第8行用Inner Join連接TJ02T, 後者存放了所有系統狀態的ID和描述。 Inner Join測試結果:對於那些在TJ02T裏沒有維護描述信息的狀態,它們不會出現

Detected cartesian product for LEFT OUTER join

carte pro 卡爾 tween led 12px new mce style spark做表連接的時候出現這個錯誤, Exception in thread "main" org.apache.spark.sql.AnalysisException: Detect

hive 引數優化之hive.auto.convert.join

Total MapReduce jobs = 1 14/08/24 20:29:11 WARN conf.Configuration: mapred.max.split.size is deprecated. Instead, use mapreduce.input.fileinputforma

JOIN連線:LEFT OUTER JOIN

外聯接。外聯接可以是左向外聯接、右向外聯接或完整外部聯接。  在 FROM 子句中指定外聯接時,可以由下列幾組關鍵字中的一組指定: LEFT JOIN 或 LEFT OUTER JOIN。  左向外聯接的結果集

hive 四種join的區別

tableA的結構及資料: id   name       grade     dept 1    lijie1   100.0   1

半連線(Semi-join

    假設一個場景,需要連線兩個很大的資料集,例如,使用者日誌和 OLTP 的使用者資料。任何一個數據集都不是足夠小到可以快取在 map 作業的記憶體中。可以思考以下問題:如果在資料集的連線操作中,一個數據集中有的記錄

08-Hive高階查詢join

宣告:我的朋友,這一篇不要轉載,因為你可以直接在這裡看。 大家好,我們今天來學習Hive高階查詢join語法。 你有沒有期待把Hive學完整?我打算寫完整,只要我知道。我寫的都是比較接地氣的,因為高大上的我知道的少。砸門一起加油進步吧! 1 我們先回顧一下上一節課說的。上一節

Hive 不支援 where 子句中的子查詢, SQL 常用的 exist in 子句需要改寫。這一改寫相對簡單。考慮以下 SQL 查詢語句:

歡迎使用Markdown編輯器 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯器進行了一些功能