大資料學習(10)—— Hive進階
阿新 • • 發佈:2020-09-09
前面提到了Hive的知識點非常零散,我不知道該怎麼把這些知識點分類,跟SQL關係沒那麼大的就放在這一篇吧。
Hive Serde
Serde是啥
Serde是序列化和反序列化的簡稱。為啥這麼說?序列化是Serializer,反序列化是Deserializer,各取前幾個字母一拼就成了。Hive裡的序列化和反序列化幹嘛用的?簡單的說,就是在HDFS檔案和表資料之間做轉換。
- Hive使用Serde(還有檔案格式化)來讀寫表記錄。
- 讀資料:HDFS檔案->輸入檔案格式->鍵值對->反序列化->行物件。
- 寫資料:行物件->序列化->鍵值對->輸出檔案格式->HDFS檔案
注意:鍵值對的鍵在讀資料的時候會被忽略,在寫資料的時候是個常量。基本上行物件只儲存值。org.apache.hadoop.hive.serde這個類已經不推薦使用了,要使用新的org.apache.hadoop.hive.serde2。
Hive使用這些檔案格式化的類來讀寫HDFS檔案: TextInputFormat/HiveIgnoreKeyTextOutputFormat: 讀寫些文字格式的檔案 SequenceFileInputFormat/SequenceFileOutputFormat: 讀寫Hadoop SequenceFile格式的檔案。SequenceFile裡儲存二進位制的鍵值對。
針對不同格式的資料,Hive提供了不同的序列化/反序列化處理類(通俗地說,就是從特定格式的資料檔案中提取想要的內容或者把內容寫成特定格式的資料檔案),詳細資訊請參考官網,這裡不再贅述。
動態分割槽
靜態分割槽必須手工給分割槽欄位賦值,其結果是一個檔案的所有資料都屬於同一個分割槽。這不是我們想要的,我們希望能夠根據檔案中某個欄位來將資料雜湊到不同的分割槽中。動態分割槽就是解決這個問題。
--動態分割槽語法: INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROMfrom_statement; INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
從上可知,動態分割槽表的記錄必須是從其他已經存在的表裡獲取的,不能直接從檔案載入。
分桶
分桶有點像分割槽。分割槽是把資料檔案放到不同的目錄下,分桶是把資料放到同一個目錄的不同的檔案中。建分桶表的時候,會指定一個分桶的欄位,根據桶的數量來計算雜湊到哪個桶裡。分桶的好處是,可以更快地從不同的桶中獲取抽樣資料。
首先設定分桶引數 set hive.enforce.bucketing = true; CREATE TABLE user_info_bucketed(user_id BIGINT, firstname STRING, lastname STRING) COMMENT 'A bucketed copy of user_info' PARTITIONED BY(ds STRING) CLUSTERED BY(user_id) INTO 256 BUCKETS; FROM user_id INSERT OVERWRITE TABLE user_info_bucketed PARTITION (ds='2009-02-25') SELECT userid, firstname, lastname WHERE ds='2009-02-25';
上面的例子,根據user_id欄位,把資料分散到256個桶裡。可以看到,分桶表的資料也只能從其他已經存在的表獲取。