Hive join轉化為MapReduce任務

2021-10-11 18:49:20 字數 1313 閱讀 8893

1)只支援等值join,因為非等值連線非常難轉化為mapreduce任務

示例:select a.* from a join b on a.id = b.id是正確的,然而:select a.* from a join b on a.id>b.id是錯誤的。

2)可以join多個表,如果join中多個表的join的列是同乙個,則join會被轉化為單個mapreduce任務

示例:select a., b., c.* from a join b on a.col= b.col1 join c on c.col= b.col1被轉化為單個mapreduce任務,因為join中只使用了b.col1作為join列。

但是如下寫法會被轉化為2個mapreduce任務。因為 b.col1用於第一次join條件,而 b.col2用於第二次 join

select a.*, b.*, c.* from a join b on a.col= b.col1 join c on c.col= b.col2;
3)join時,轉換為mapreduce任務的邏輯

reduce會快取join序列中除了最後乙個表的所有表的記錄(具體看啟動了幾個map/reduce任務),再通過最後乙個表將結果序列化到檔案系統。這一實現有助於在reduce端減少記憶體的使用量。實踐中,應該把最大的那個表寫在最後(否則會因為快取浪費大量記憶體)。

示例:a. 單個map/reduce任務

select a.*, b.*, c.* from a join b on a.col= b.col1 join c on c.col= b.col1
中所有表都使用同乙個join列。reduce端會快取a表和b表的記錄,然後每次取得乙個c表的記錄就計算一次join結果;

b. 多個map/reduce任務

select a.*, b.*, c.* from a join b on (a.col= b.col1) join c on (c.col= b.col2)。
第一次快取a表,用b表序列化;第二次快取第一次mapreduce任務的結果,然後用c表序列化。

4)left semi join

經常用來替換 in和exists。

如,select * from a left semi join b on a.id = b.id;

相當於select * from a where a.id exists(select b.id from b);但這種方式在hive中效率極低。

base64轉化為blob,blob轉化為file

背景 最近在做乙個移動端手寫簽名的功能。需求是將手寫簽名生成存到後台,實現步驟 canvas畫圖,生成base64,將base64轉為file物件。1,canvas具體怎麼實現手寫簽名,不在細講,主要是touchmove.touchstart,touchend事件和canvas畫筆工具結合,生成ba...

獲取當前時間並轉化為轉化為各種格式

在專案中直接把 複製成乙個fortime.js檔案,然後在需要用到的時候import或者require一下,根據需要用 例如 var fortime require utils fortime.js 然後根據需要選擇是 fortime.formattime new date fortime.form...

map轉化為物件

如何把map 轉化為指定物件呢?先看測試 test public void test convertmap2obj throws instantiationexception,illegalacces ception,securityexception,nosuchfieldexception,il...