日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ORC文件存储格式的深入探究

發布時間:2024/2/28 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ORC文件存储格式的深入探究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、ORC文件格式

ORC的全稱是(Optimized Record Columnar),使用ORC文件格式可以提高hive讀、寫和處理數據的能力。ORC在RCFile的基礎上進行了一定的改進,所以與RCFile相比,具有以下一些優勢:?
- 1、ORC中的特定的序列化與反序列化操作可以使ORC file writer根據數據類型進行寫出。?
- 2、提供了多種RCFile中沒有的indexes,這些indexes可以使ORC的reader很快的讀到需要的數據,并且跳過無用數據,這使得ORC文件中的數據可以很快的得到訪問。?
- 3、由于ORC file writer可以根據數據類型進行寫出,所以ORC可以支持復雜的數據結構(比如Map等)。?
- 4、除了上面三個理論上就具有的優勢之外,ORC的具體實現上還有一些其他的優勢,比如ORC的stripe默認大小更大,為ORC writer提供了一個memory manager來管理內存使用情況。

?

二、ORC數據存儲方法

在ORC格式的hive表中,記錄首先會被橫向的切分為多個stripes,然后在每一個stripe內數據以列為單位進行存儲,所有列的內容都保存在同一個文件中。每個stripe的默認大小為256MB,相對于RCFile每個4MB的stripe而言,更大的stripe使ORC的數據讀取更加高效。?

對于復雜數據類型,比如Map,ORC文件會將一個復雜數據類型字段解析成多個子字段。下表中列舉了ORC文件中對于復雜數據類型的解析
?

Data typeChile columns
Array一個包含所有數組元素的子字段
Map兩個子字段,一個key字段,一個value字段
Struct每一個屬性對應一個子字段
Union每一個屬性對應一個子字段

當字段類型都被解析后,會由這些字段類型組成一個字段樹,只有樹的葉子節點才會保存表數據,這些葉子節點中的數據形成一個數據流,如上圖中的Data Stream。?

為了使ORC文件的reader更加高效的讀取數據,字段的metadata會保存在Meta Stream中。在字段樹中,每一個非葉子節點記錄的就是字段的metadata,比如對一個array來說,會記錄它的長度。下圖根據表的字段類型生成了一個對應的字段樹。?
  

在Hive-0.13中,ORC文件格式只支持讀取指定字段,還不支持只讀取特殊字段類型中的指定部分。?

使用ORC文件格式時,用戶可以使用HDFS的每一個block存儲ORC文件的一個stripe。對于一個ORC文件來說,stripe的大小一般需要設置得比HDFS的block小,如果不這樣的話,一個stripe就會分別在HDFS的多個block上,當讀取這種數據時就會發生遠程讀數據的行為。如果設置stripe的只保存在一個block上的話,如果當前block上的剩余空間不足以存儲下一個strpie,ORC的writer接下來會將數據打散保存在block剩余的空間上,直到這個block存滿為止。這樣,下一個stripe又會從下一個block開始存儲。?
?

三、索引

在ORC文件中添加索引是為了更加高效的從HDFS讀取數據。在ORC文件中使用的是稀疏索引(sparse indexes)。在ORC文件中主要有兩種用途的索引,一個是數據統計(Data Statistics)索引,一個是位置指針(Position Pointers)索引。
?

1. Data Statistics

ORC reader用這個索引來跳過讀取不必要的數據,在ORC writer生成ORC文件時會創建這個索引文件。這個索引中統計的信息主要有記錄的條數,記錄的max, min, sum值,以及對text類型和binary類型字段還會記錄其長度。對于復雜數據類型,比如Array, Map, Struct, Union,它們的子字段中也會記錄這些統計信息。?

在ORC文件中,Data Statistics有三個level。?

(1)file level statistics?

在ORC文件的末尾會記錄文件級別的統計信息,會記錄整個文件中columns的統計信息。這些信息主要用于查詢的優化,也可以為一些簡單的聚合查詢比如max, min, sum輸出結果。?

(2)stripe level statistics?

ORC文件會保存每個字段stripe級別的統計信息,ORC reader使用這些統計信息來確定對于一個查詢語句來說,需要讀入哪些stripe中的記錄。比如說某個stripe的字段max(a)=10,min(a)=3,那么當where條件為a >10或者a <3時,那么這個stripe中的所有記錄在查詢語句執行時不會被讀入。?

(3)index group level statistics?

為了進一步的避免讀入不必要的數據,在邏輯上將一個column的index以一個給定的值(默認為10000,可由參數配置)分割為多個index組。以10000條記錄為一個組,對數據進行統計。Hive查詢引擎會將where條件中的約束傳遞給ORC reader,這些reader根據組級別的統計信息,過濾掉不必要的數據。如果該值設置的太小,就會保存更多的統計信息,用戶需要根據自己數據的特點權衡一個合理的值。?
?

3. Position Pointers

當讀取一個ORC文件時,ORC reader需要有兩個位置信息才能準確的進行數據讀取操作。?

(1)metadata streams和data streams中每個group的開始位置?

由于每個stripe中有多個group,ORC reader需要知道每個group的metadata streams和data streams的開始位置。圖1中右邊的虛線代表的就是這種pointer。?

(2)stripes的開始位置?

由于一個ORC文件可以包含多個stripes,并且一個HDFS block也能包含多個stripes。為了快速定位指定stripe的位置,需要知道每個stripe的開始位置。這些信息會保存在ORC file的File Footer中。如圖1中間位置的虛線所示。
?

四、文件壓縮

ORC文件使用兩級壓縮機制,首先將一個數據流使用流式編碼器進行編碼,然后使用一個可選的壓縮器對數據流進行進一步壓縮。?

一個column可能保存在一個或多個數據流中,可以將數據流劃分為以下四種類型:?

? Byte Stream?
字節流保存一系列的字節數據,不對數據進行編碼。?

? Run Length Byte Stream?

字節長度字節流保存一系列的字節數據,對于相同的字節,保存這個重復值以及該值在字節流中出現的位置。?

? Integer Stream?

整形數據流保存一系列整形數據。可以對數據量進行字節長度編碼以及delta編碼。具體使用哪種編碼方式需要根據整形流中的子序列模式來確定。?

? Bit Field Stream?

比特流主要用來保存boolean值組成的序列,一個字節代表一個boolean值,在比特流的底層是用Run Length Byte Stream來實現的。?

接下來會以Integer和String類型的字段舉例來說明。?

(1)Integer?

對于一個整形字段,會同時使用一個比特流和整形流。比特流用于標識某個值是否為null,整形流用于保存該整形字段非空記錄的整數值。?

(2)String?

對于一個String類型字段,ORC writer在開始時會檢查該字段值中不同的內容數占非空記錄總數的百分比不超過0.8的話,就使用字典編碼,字段值會保存在一個比特流,一個字節流及兩個整形流中。比特流也是用于標識null值的,字節流用于存儲字典值,一個整形流用于存儲字典中每個詞條的長度,另一個整形流用于記錄字段值。?

如果不能用字典編碼,ORC writer會知道這個字段的重復值太少,用字典編碼效率不高,ORC writer會使用一個字節流保存String字段的值,然后用一個整形流來保存每個字段的字節長度。?


在ORC文件中,在各種數據流的底層,用戶可以自選ZLIB, Snappy和LZO壓縮方式對數據流進行壓縮。編碼器一般會將一個數據流壓縮成一個個小的壓縮單元,在目前的實現中,壓縮單元的默認大小是256KB。
?

五、內存管理

當ORC writer寫數據時,會將整個stripe保存在內存中。由于stripe的默認值一般比較大,當有多個ORC writer同時寫數據時,可能會導致內存不足。為了現在這種并發寫時的內存消耗,ORC文件中引入了一個內存管理器。在一個Map或者Reduce任務中內存管理器會設置一個閾值,這個閾值會限制writer使用的總內存大小。當有新的writer需要寫出數據時,會向內存管理器注冊其大小(一般也就是stripe的大小),當內存管理器接收到的總注冊大小超過閾值時,內存管理器會將stripe的實際大小按該writer注冊的內存大小與總注冊內存大小的比例進行縮小。當有writer關閉時,內存管理器會將其注冊的內存從總注冊內存中注銷。
?

六、參數

參數名默認值說明
hive.exec.orc.default.stripe.size256*1024*1024stripe的默認大小
hive.exec.orc.default.block.size256*1024*1024orc文件在文件系統中的默認block大小,從hive-0.14開始
hive.exec.orc.dictionary.key.size.threshold0.8String類型字段使用字典編碼的閾值
hive.exec.orc.default.row.index.stride10000stripe中的分組大小
hive.exec.orc.default.compressZLIBORC文件的默認壓縮方式
hive.exec.orc.skip.corrupt.datafalse遇到錯誤數據的處理方式,false直接拋出異常,true則跳過該記錄

更多參數參考:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties#ConfigurationProperties-ORCFileFormat

推薦一篇英文文章介紹ORC:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

摘自:https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU3MzgwNTU2Mg==&scene=124#wechat_redirect

總結

以上是生活随笔為你收集整理的ORC文件存储格式的深入探究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产超碰人人 | 久久青青 | 国产色诱视频 | 在线观看色视频 | 久久综合爱 | 国产黄色三级 | 久热免费视频 | 午夜久草 | 日韩精品一区中文字幕 | 自拍21区 | 国产男女裸体做爰爽爽 | 国产高潮久久 | 日韩精品在线播放 | 夜夜春视频 | 天堂资源在线 | 亚洲调教 | 欧洲久久久 | 亚洲精品第一 | 婷婷综合在线视频 | 欧美日韩免费一区二区三区 | 精品视频在线观看一区 | 亚洲成色在线 | 杨幂一区二区国产精品 | 女生抠逼视频 | 91精品国产综合久久久久久 | 欧洲国产视频 | 国产精品一区二区三区免费看 | 一二三在线视频 | 99精品欧美一区二区 | 午夜影院入口 | 黑人操欧美人 | 人妻少妇精品久久 | 在线观看污视频网站 | 免费av看| 成人免费无码大片a毛片抽搐色欲 | 成人精品在线视频 | 三叶草欧洲码在线 | 黄色网址在线免费观看 | 青青草原伊人网 | 香蕉视频网站在线观看 | 亚洲国产精品狼友在线观看 | 日本成人免费在线 | 色呦呦官网 | 亚洲午夜精选 | 主播福利在线 | 久久精品成人一区二区三区蜜臀 | 亚洲av无码乱码国产精品fc2 | 国产毛片毛片毛片毛片毛片毛片 | 性综合网 | 99成人在线观看 | 裸体的日本在线观看 | 国产 欧美 日本 | 国产l精品国产亚洲区久久 午夜青青草 | 国产又粗又硬又长又爽的演员 | 欧美成a | 久久久久久一区 | 中文字幕少妇在线三级hd | 国产东北女人做受av | wwwxxx黄色片 | 五月婷婷综合久久 | 伊人网影院 | 伊人色综合久久天天 | 超碰97免费在线 | 老司机一区二区 | 色香欲综合网 | 欧美精品videosex极品 | www.插插插.com | 免费观看理伦片在线播放视频软件 | 免费激情片 | 成年人视频免费在线观看 | 欧美一级大片免费看 | 亚洲成肉网 | 深夜影院深a | 欧美性受xxx黑人xyx性爽 | 99国产在线| 日韩新片王网 | 日韩国产欧美综合 | 精品人妻伦一二三区免费 | 日本一区二区三区免费电影 | 色偷偷中文字幕 | 黄片毛片av | 伊人狠狠干 | 久久久国产一区二区三区 | av伊人久久| 日日爽天天 | 九九久久免费视频 | 亚洲福利视频一区二区三区 | 精品福利三区3d卡通动漫 | 日韩乱码一区二区三区 | 日韩精品高清在线 | 国产免费三片 | av免费观看网站 | 69网站在线观看 | 日韩一二三级 | 粗大的内捧猛烈进出在线视频 | 一区二区三区视频免费看 | 亚洲激情综合网 | 日韩欧美成人精品 | 91影视在线观看 |