Hive查詢Join

Select a.val,b.val From a [Left|Right|Full Outer] Join b On (a.key==b.key);

現有兩張表:sales?列出了人名及其所購商品的?ID;things?列出商品的?ID?和名稱:

hive> select * from sales;
OK
Joe     2
Hank    4
Ali     0
Eve     3
Hank    2
Time taken: 0.085 seconds, Fetched: 5 row(s)
hive> select * from things;
OK
2       Tie
4       Coat
3       Hat
1       Scarf
Time taken: 0.069 seconds, Fetched: 4 row(s)

1.內連接

Hive只支持等值連接,這意味著在?ON?關鍵字后的表達式中只能使用等號具體JAVA-API實現詳見:MR案例:內連接

hive> select sales.*,things.*> from sales JOIN things ON(sales.id = things.id);
Joe     2       2       Tie
Hank    4       4       Coat
Eve     3       3       Hat
Hank    2       2       Tie

此外還可以在Where子句中指定連接條件。?

hive> select sales.*,things.*                  > from sales,things> where sales.id = things.id;
OK
Joe     2       2       Tie
Hank    4       4       Coat
Eve     3       3       Hat
Hank    2       2       Tie

單個的連接用一個?MR?作業實現。但是,如果多個連接的連接條件中使用了相同的列,那么平均每個連接可以至少用一個?MR?作業來實現。可以在查詢前使用?Explain關鍵字 來查看?Hive將為某個查詢使用多少個?MR?作業:【此部分在以后詳述

hive> explain> select sales.*,things.*> from sales join things on (sales.id=things.id);

2.外連接

外連接可以讓你找到連接表中不能匹配的數據行。前面的內連接,【Ali】那一行沒有出現在輸出中。因為她所購買商品的ID沒有在things表中出現。具體JAVA-API實現詳見MR案例:外連接

  左外連接:就可以顯示左邊表的所有數據行:T_Name1 LEFT OUTER JOIN T_Name2 ON ()

hive> select sales.*,things.*                             > from sales LEFT OUTER JOIN things ON(sales.id = things.id);
OK
Joe     2       2       Tie
Hank    4       4       Coat
Ali     0       NULL    NULL
Eve     3       3       Hat
Hank    2       2       Tie
Time taken: 13.387 seconds, Fetched: 5 row(s)

  右外連接T_Name1 RIGHT?OUTER JOIN T_Name2 ON ()

hive> select sales.*,things.*                                    > from sales RIGHT OUTER JOIN things ON(sales.id = things.id);
OK
Joe     2       2       Tie
Hank    2       2       Tie
Hank    4       4       Coat
Eve     3       3       Hat
NULL    NULL    1       Scarf
Time taken: 14.54 seconds, Fetched: 5 row(s)

  全外連接T_Name1 FULL OUTER?JOIN T_Name2 ON ()

hive> select sales.*,things.*                                     > from sales FULL OUTER JOIN things ON(sales.id = things.id); 
OK
Ali     0       NULL    NULL
NULL    NULL    1       Scarf
Hank    2       2       Tie
Joe     2       2       Tie
Eve     3       3       Hat
Hank    4       4       Coat
Time taken: 44.671 seconds, Fetched: 6 row(s)

  半連接T_Name1 LEFT SEMI JOIN T_Name2 ON () 

hive> select * from things> where things.id in   > (select id from sales);
OK
2       Tie
4       Coat
3       Hat
Time taken: 15.633 seconds, Fetched: 3 row(s)

  In查詢可以轉化為?半連接查詢。必須遵循一個限制:右表(sales)只能在ON子句中出現。

hive> select * from things > LEFT SEMI JOIN sales ON(sales.id=things.id);
OK
2       Tie
4       Coat
3       Hat
Time taken: 13.169 seconds, Fetched: 3 row(s)

3.Map-side Join 具體JAVA-API實現詳見MR案例:Map-Join

  • Join操作在 map 階段完成,因此無需 reduce 階段
  • 適合 一個大表,一個小表 的 Join 操作
  • 思想:小表復制到各個節點上,并加載到內存中;而對大表進行分片,每個分片與小表完成 Join 操作
select /*+ mapjoin(things) */ sales.*,things.*
from sales join things on sales.id=things.id;//等同于
select sales.*,things.*
from sales join things on sales.id=things.id;
  • hive 0.6 的時候默認認為寫在select 后面的是大表,前面的是小表,或者使用 /*+mapjoin(map_table) */ 手工進行設定。
  • hive 0.7 以后這個計算是自動完成,設置 hive.auto.convert.join=true ,hive會自動判斷哪個是小表,哪個是大表。判斷小表的依據是hive.smalltable.filesize=25000000L(默認是25M),當小表超過這個大小,hive會自動轉化成common?join,即reduce-join。?

4.Reduce-side Join 具體JAVA-API實現詳見MR案例:Reduce-Join

  • Join操作在reduce task中完成 【默認的join方式
  • 適合兩個大表連接操作
  • 思想:map端按照連接字段進行hash,reduce 端完成連接操作

5.用于多于2個表的Join(有區別)

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1);

如果 Join 的 key 相同,不管有多少個表,都會則會合并為一個 Map-Reduce

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1)JOIN c ON (c.key = b.key2);

如果 Join 的條件不相同,Map-Reduce 的任務數目和 Join 操作的次數是相對應.(本例2次)

6.Join每次MR任務的邏輯

reducer 會緩存 join 序列中除了最后一個表的所有表的記錄,?再通過最后一個表將結果序列化到文件系統。?這一實現有助于在 reduce 端減少內存的使用量。實踐中,應該把最大的那個表寫在最后(否則會因為緩存浪費大量內存)。例如:

 SELECT a.val, b.val, c.val FROM aJOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1);

使用 1 次MR任務,reduce 端會緩存 a 表和 b 表的記錄,然后每次取得一個 c 表的記錄就計算一次 join 結果。

  SELECT a.val, b.val, c.val FROM aJOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2);

使用 2 次MR任務,第一次緩存 a 表,用 b 表序列化;第二次緩存第一次 map/reduce 任務的結果,然后用 c 表序列化。

?

轉載于:https://www.cnblogs.com/skyl/p/4737347.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374627.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374627.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374627.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jquery 獲取easyui combobox選中的值

$(#comboboxlist).combobox(getValue);轉載于:https://www.cnblogs.com/ftm-datablogs/p/5526857.html

調度Java應用程序中的主體

許多項目需要計劃功能,例如我們計劃的工作,重復的工作,異步執行等。 我們的首選方法是使用企業工作調度程序,例如OpenSymphony的Quartz。 使用計劃任務進行編碼時,最棘手的部分之一是執行部分。 這里的主要經驗法則是…

繼承映射關系 joinedsubclass的查詢

會出現下面這樣的錯一般是配置文件中的mapping和映射文件中的package路徑或者class中的name路徑不一致 org.hibernate.MappingException: Unknown entity: com.zh.hibernate.joinedsubclass.Student at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(Sessi…

Spark系列—02 Spark程序牛刀小試

一、執行第一個Spark程序 1、執行程序 我們執行一下Spark自帶的一個例子,利用蒙特卡羅算法求PI: 啟動Spark集群后,可以在集群的任何一臺機器上執行一下命令: /home/spark/spark-1.6.1-bin-hadoop2.6/bin/spark-submit \ --class o…

JVM選項:-client vs -server

您是否曾經在運行Java應用程序時想知道-client或-server開關是什么? 例如: javaw.exe -client com.blogspot.sdoulger.LoopTest也顯示在java.exe的“幫助”中,例如,其中的選項包括: -client選擇“客戶端” VM -serv…

網頁前臺小知識

1.左右布局div塊自適應,首先外邊套一個div,把寬度固定一個px,然后margin設為0 atuo;這樣他會根據窗口大小自動變換左右距離.就這么簡單</p> 2.多個標簽共用一個樣式,用,分隔開 p…

統計字符串每個字符出現的次數

//str是個只包含小寫字母的字符串&#xff0c;以下是統計每個字符出現的頻數 int[] cnt new int[26];//toCharArray() for (char ch : str.toCharArray()) {cnt[ch - a]; }//charAt() for(int i 0;i<str.length;i){char ch str.charAt(i);cnt[ch - a]; }

在Java 7中處理文件

以下是The Well-Grounded Java Developer的草稿的修改后的片段。 它使您快速了解與以前版本相比&#xff0c;在Java 7中操作文件要容易得多。 通過使用新的Files類及其許多實用程序方法&#xff0c;您可以僅用一行代碼就可以對文件執行以下操作&#xff1a; 創建 刪除 復制 …

3.1存儲管理操作系統

存儲器管理的對象是主存&#xff08;內存&#xff09;。其主要功能包含分配和回收主存空間、提高主存的利用率、擴充主存、對主存信息實現有效保護。存儲器的結構為&#xff1a;寄存去、緩存、主存、外存。邏輯地址&#xff08;對用戶角度。程序存放的位置&#xff09;、物理地…

學習教材《構建之法》遇到的問題及思路

在學習中每個人都會遇到各種各樣的問題&#xff0c;下面就是我遇到的問題及可能解決問題的思路。 1.如何寫好程序的注釋&#xff0c;每個人都會寫注釋&#xff0c;但是&#xff0c;需要注釋什么&#xff1f; 思路&#xff1a;注釋是為了解釋程序做什么&#xff0c;為什么要這樣…

了解和擴展Java ClassLoader

Java ClassLoader是項目開發中Java的關鍵但很少使用的組件之一。 就我個人而言&#xff0c;我從未在任何項目中擴展ClassLoader&#xff0c;但是擁有自己的可以自定義Java類加載的ClassLoader的想法讓我感到很興奮。 本文將概述Java類加載&#xff0c;然后繼續創建自定義ClassL…

CAD教程-AL對其命令

AL可以實現不規則的對其功能 1.第一步按下AL&#xff0c;按下Enter 2.選擇第一個源點 3.選擇第一個目標點 4.選擇第二個源點 5.選擇第二個目標點 6.按下Enter&#xff0c;完成移位 轉載于:https://www.cnblogs.com/weloveshare/p/4739873.html

使用Spring將POJO公開為JMX MBean

這是一個非常不錯的教程&#xff0c;介紹了如何通過我們最新的JCG合作伙伴 “ The Holy Java ”博客&#xff08;很酷的名字&#xff09;實現“ 用Spring輕松將POJO作為JMX MBean公開 ”。 &#xff08;注意&#xff1a;對原始帖子進行了少量編輯以提高可讀性&#xff09; Jav…

mysql 5.1由于Host為localhost的用戶為空,密碼為空,導致本地用戶無法登陸。

不說了。直接上mysql的用戶數據&#xff0c;第四列里面&#xff0c;host為localhost&#xff0c;用戶為空&#xff0c;密碼為空。 導致在本地登陸的時候除了root的賬戶外&#xff0c;其他賬號不需要密碼即可登陸&#xff0c;并且影響host為 %的用戶登陸。 這里只需要刪除對應的…

scala 88 for替換map,flatmap,filtermap,for,scala,flatmap

王家林親授《DT大數據夢工廠》大數據實戰視頻“Scala深入淺出實戰經典”視頻、音頻和PPT下載&#xff01;第88講&#xff1a;Scala中使用For表達式實現map、flatMap、filter百度云盤&#xff1a;http://pan.baidu.com/s/1mgtgcIG360云盤&#xff1a;http://yunpan.cn/cdXsbctXf…

簡單闡述下OC中UIImage三種創建方式~~~

一. 直接使用imageNamed進行創建 1 UIImage * image [UIImage imageNamed:"1.jpg"]; 簡單說一下這種方式的優缺點&#xff1a; 優點&#xff1a;代碼量少&#xff0c;一行代碼就可以搞定。當程序中多次加載這張圖片時&#xff0c;系統會指向同一塊內存&#xff0c;…

(一二四)tableView的多組數據展示和手動排序

最近在寫一個輕量級的網絡游戲&#xff0c;遇到了技能優先順序手動排序的需求&#xff0c;我就想到了iOS自帶的tableView編輯功能&#xff0c;對其進行了初步探索&#xff0c;最后做出的效果如下圖所示&#xff1a; 點擊左邊可以刪除&#xff0c;拖住右邊可以手動排序&#xff…

ARC_xp_20160530

1、 申請內存的地方在哪里&#xff1f;忘了...(應該是用的 malloc) 2、 鍵盤上按下一個鍵&#xff0c;處理的函數為&#xff1a;(所在的模塊 應該是“CEGUIIrrlichtRenderer.dll”) 003B465F CC INT3 003B4660 /$ 53 PUSH EBX 003B4661 |. 56 …

Hibernate映射集合性能問題

首先&#xff0c;這篇文章的靈感來自于Burt Beckwith在2011年1月27日于SpringOne 2GX上發表的有關高級GORM –性能&#xff0c;定制和監控的演講 。 簡而言之&#xff0c; Burt Beckwith討論了使用映射集合和GORM中的Hibernate 2級緩存的潛在性能問題&#xff0c;以及避免此類性…

算法:1!+(1!+3!)+(1!+3!+5!) + ( 1! + 3! + 5! + 7! + 9!)+....+(1!+3!+5!+ ... + m!)...

-(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{ //算法入口 [self func2:9]; } //計算階乘 factor&#xff08;m&#xff09;&#xff1d; m&#xff01; -(int)factor:(int)m{ int factorNum0; if(m0|m1) return 1; e…