中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hive的原理與技巧是怎樣的

發布時間:2021-12-03 17:56:01 來源:億速云 閱讀:149 作者:柒染 欄目:云計算

這期內容當中小編將會給大家帶來有關Hive的原理與技巧是怎樣的,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Hive Order/Sort/Distribute/Cluster By:

Order By:會在一個reducer中對所有數據進行排序,為了防止數據量過大導致排序緩慢,hive默認處于strict mode(也即hive.mapred.mode=strict),而且查詢語句后面必須跟隨limit條件,除非將hive.mapred.mode設置為nonstrict(數據量很大時請慎重設置)。

Sort By:會在將數據發往reducer之前進行排序,如果列是數值類型則進行數值排序,如果是字符串類型也將進行詞序上的排序。這個排序的效果是每個reducer出來的結果是有序的,但全局不一定有序(也即最終結果是分段有序)。

Distribute By:會將同一個列值的數據發往同一個reducer,但不保證一個列值一個reducer,也不保證發往reducer時將數據排序。例如x1,x2,x4,x3,x1這五個列值發往兩個reducer,則reducer1會得到x1,x2,x1,reducer2會得到x4,x3,而且每個reducer中的數據也未排序。

Cluster By:這個排序等同于Distribute By 加 Sort By,例如對上述數據使用Cluster By,則reducer1會得到x1,x1,x2,reducer2會得到x3,x4。然而Cluster By只能指定同一字段的分發和排序,但Distribute By和 Sort By的組合則能指定不同的分發和排序的列值。

補充:官方文檔中這段話不是很理解,誰能解釋下:Note: It may be confusing as to the difference between SORT BY alone of a single column and CLUSTER BY. The difference is that CLUSTER BY partitions by the field and SORT BY if there are multiple reducers partitions randomly in order to distribute data (and load) uniformly across the reducers.

詳細參考:Hive LanguageManual

備注:如果SELECT DISTINCT xxx FROM table SORT BY yyy,會報錯Invalid table alias or column reference 'xxx': (possible column names are: _col0),因為使用DISTINCT關鍵字后會對DISTINCT用到的關鍵字進行默認的升序排序(可以用ORDER BY或者SORT BY來改變規則),而且使用DISTINCT時,排序的字段必須跟在SELECT中。

Hive 型轉換:

Hive支持類型隱式轉換,例如會在必要的時候對類型進行隱式轉換,例如event_day為string類型,然而碰到where event_day=20140703語句時,int型的20140703會被轉換為string類型。

或者使用強制類型轉換,例如cast(event_day as double)=20140703.0

詳細移步官方文檔:Allowed Implicit Conversions、或者Hive數據類型轉換

對于Hive的表結構/分區的理解:

首先描述一個現象:

CREATE EXTERNAL TABLE IF NOT EXISTS test (
    name          STRING,
    age           INT
)
PARTITIONED BY (date INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
ALTER TABLE test ADD PARTITION(date=20140710) LOCATION '/test/20140710/';
LOAD DATA LOCAL INPATH "/home/work/20140710.txt" INTO TABLE test PARTITION(date=20140710);
#20140710.txt內容:
#Baron    999999999(注:超出int范圍)

A:如上,此時“SELECT * FROM test;”得到的內容中age字段值為NULL;在“ALTER TABLE test CHANGE COLUMN age age STRING AFTER name;”之后重新查詢還是之前的效果;但是在“ALTER TABLE test DROP IF EXISTS PARTITION(date=20140710);”并重新添加PARTITION之后,可以查詢到age值。

B:反過來,定義表時如果age為STRING型,查詢可得到age值,將age字段類型改為int型則查詢不到,再改為STRING型之后,可以重新查到數據(這個過程中沒有設計PARTITION更新操作)。

在諸多周轉測試之后,了解到這么一個現象(或者原理):Hive的PARTITION只受在其之前定義的表結構屬性的影響,在PARTITION被創建之后發生的表屬性更新,將不影響PARTITION在創建之初所保存的元數據,該元數據保存著先前定義的表的一些屬性。

因此,A的PARTITION中元數據保存的字段是INT類型,即使表字段更新為STRING,還是不會更新PARTITION中早已存在的屬性。B中PARTITION元數據保存的是STRING類型,改為INT后查不到值(無法轉型),再改為STRING類型之后還是能查到,分區中元數據不變。(這段話有點站不住腳跟,不知是不是PARTITION元數據跟HIVE當前表結構共同作用在查詢上,產生了交集約束;有朋友對這方面能解釋的嗎?)

上述就是小編為大家分享的Hive的原理與技巧是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白山市| 垣曲县| 朝阳县| 阿城市| 静乐县| 东乡| 威宁| 福泉市| 红桥区| 同江市| 宜黄县| 安陆市| 延安市| 大名县| 鲜城| 滦平县| 屏边| 博客| 怀柔区| 合阳县| 临武县| 南澳县| 开封县| 本溪市| 乃东县| 吉安市| 彭阳县| 菏泽市| 且末县| 黄冈市| 鹤庆县| 铁岭市| 新安县| 察隅县| 香港| 比如县| 莲花县| 资源县| 昭觉县| 多伦县| 南汇区|