天天看點

Hive程式設計指南-要點總結(1)

1. 當對3個或更多的表進行join連接配接時,若是on子句都是使用相同的連接配接鍵的話,那麼隻會産生一個mapreduce任務。

2. 使用者在進行多表查詢時,需要保證連續查詢的表的大小從左至右是依次增大的。因為Hive假定查詢中最後一個表是最大的表,在對每行記錄進行連接配接操作時,它會嘗試将其他表緩存起來,然後掃描最後那個大表進行計算。

3. map-side join:使用Broadcast實作map側join的方式可通過如下設定,将Broadcast的門檻值設定得足夠大,再通過sql進行join

SET spark.sql.autoBroadcastJoinThreshold=104857600;
INSERT OVERWRITE TABLE test_join
SELECT test_new.id, test_new.name
FROM test
JOIN test_new
ON test.id = test_new.id
           

4. on條件語句中的分區過濾條件在外連接配接outer join中是無用的,不過在内連接配接inner join 中是有效的。

5. 左半開連接配接left semi join會傳回滿足on條件的左邊表的記錄,相比于内連接配接inner join,是一種特殊優化的join語句,等價于in & exist文法結構。semi join比inner join更高效,對于左表中的一條指定記錄,一旦在右表中找到滿足on條件的記錄就會停止掃描右表。即對于左表的一條指定記錄,隻會保留一條右表比對記錄,而inner join則是傳回了多條比對記錄。  

注意select和where語句中不能出現右表中的字段。 另外,Hive不支援右半開連接配接。

6. 笛卡爾積join,即不加on條件的join,其結果集的大小等于左表行數乘右表行數的大小。執行時間長且運作緩慢。

7. order by,sort by,distribute by,cluster by差別

  • order by

    (1):order by後面可以有多列進行排序,預設按字典排序。

    (2):order by為全局排序。

    (3):order by需要reduce操作,且隻有一個reduce,無法配置(因為多個reduce無法完成全局排序)。

    注:如果在strict模式下使用order by語句,那麼必須要在語句中加上limit關鍵字,因為執行order by的時候隻能啟動單個reduce,如果排序的結果集過大,那麼執行時間會非常漫長。

  • sort by

    sort by不是全局排序,其在資料進入reducer前完成排序,是以,如果用sort by進行排序,并且設定mapred.reduce.tasks>1,則sort by隻會保證每個reducer的輸出有序,并不保證全局有序。sort by不同于order by,它不受hive.mapred.mode屬性的影響,sort by的資料隻能保證在同一個reduce中的資料可以按指定字段排序。使用sort by你可以指定執行的reduce個數(通過set mapred.reduce.tasks=n來指定),對輸出的資料再執行歸并排序,即可得到全部結果。

  • distribute by

    distribute by是控制在map端如何拆分資料給reduce端的。hive會根據distribute by後面列,對應reduce的個數進行分發,預設是采用hash算法。distribute by經常和sort by配合使用。

  • cluster by

    cluster by除了具有distribute by的功能外還兼具sort by的功能。但是排序隻能是倒叙排序,不能指定排序規則為ASC或者DESC。