您好,登錄后才能下訂單哦!
文件存儲分行存儲和列存儲,每個存儲格式里面又分不同的類型,在實際的應用中如何去使用?怎樣去使用?快來圍觀吧!
文件存儲格式,我們在什么時候去指定呢?比如在Hve和Ipala中去創建表的時候,我們除了指定列和分隔符,在它的命令行結尾有STORED AS參數,這個參數默認是文本格式,但是文本不適合所有的場景,那么在這里我們就可以改變文本的信息。
那么到底我們應該選擇哪些格式呢?每種格式都有什么樣的特點呢?我們為什么要去選擇這種格式呢?
一、文本文件:
文本文件是Hadoop里面最基本的文件類型,可以從任何編程語言進行讀或寫,兼容逗號和tab分隔的文件以及其它很多的應用。而且文本文件直接可讀的,因為都是字符串,所以在Debug的時候非常有用。然而,數據到達一定規模,這種格式是很低效的:(1)文本文件把數值表示為string浪費了存儲空間;(2)很難表示二進制的數據,比如圖片,通常依靠其他技術,比如Base64編碼
所以文本文件格式總結起來就是:易操作,但性能低
二、序列文件
序列文件本質是基于key-value鍵值對的二進制容器格式,它比文本格式冗余更少,更高效,適合存儲二進制數據,比如圖片。而且它是Java專有格式并且跟Hadoop緊密結合。
所以序列文件格式總結起來就是:性能好,但難操作
三、Avro數據文件
Avro數據文件是二進制編碼,存儲效率更好。它不僅可以在Hadoop生態系統得到廣泛支持,還可以在Hadoop之外使用。它是長期存儲重要數據的理想選擇,可以通過多種語言讀寫。
而且它內嵌schema文件,通過這個文件我們可以很輕松的像表一樣去定義數據的模式,可以靈活制定字段及字段類型。Schema演化可以適應各種變化,比如當前指定一個Schema類型,將來增加了一些數據結構、刪除了一些數據、類型發生了變更、長度發生了變更,都是可以應對的。
所以Avro數據文件格式總結起來就是:極好的操作性和性能,是Hadoop通用存儲的最佳選擇。
以上介紹的三種格式都是行存儲,但是Hadoop里面還有一些列存儲格式。典型的OLTP以行的形式來存儲,就是以連續的行來存儲到連續的塊,當我們進行隨機的尋值訪問的時候,我們通常會去加一些條件,對于行存儲而言可以迅速定義到塊所在位置,然后提取行的數據。而列存儲以列為單位進行存儲,如果將列存儲應用于OLTP我們要定義到特定行進行掃描的時候,它會掃描到所有的列。對于列存儲應用到在線事務場景處理就是一個很恐怖的事情,列存儲的意義在于應用于大數據分析場景,比如進行特征值的抽取,變量的篩選,通常在大數據場景應用中我們會大量的應用寬表,可能對于某一業務分析而言,我們只需要使用其中一個或幾十個這樣的列,那么就可去選擇一些列進行掃描,不會掃描到全表。行存儲與列存儲并沒有絕對的好壞之分,只是彼此適用的場景不一樣。
下面我們看一下列存儲重要的存儲方式:
一、Parquet文件
Parquet文件格式非常重要,在未來也將會被廣泛的使用。我們把HDFS稱作是大數據存儲事實標準的話,那么Parquet文件就是文件存儲格式的事實標準。目前spark已經把它作為默認的文件存儲格式,可見它的重要性。最初由cloudera和twitter開發的開源列存儲格式,在MapReduce、Hive、Pig、Impala、Spark、Crunch和其他項目中支持應用。它和Avro數據文件都有Schema元數據,區別只是Parquet文件是列存儲,Avro數據文件是行存儲。這里必須要強調的是Parquet文件在編碼方面進行了一些額外優化,減少存儲空間,增加了性能。
所以Parquet文件總結起來就是:極好的操作性和性能,是基于列訪問模式的最佳選擇。
文件存儲格式,需要重點去把握和學習,尤其是每種存儲格式優劣勢,必須熟練掌握,才可以在使用中更好的去選擇使用。另外,我們在平常的工作中也要多去和別人分享交流,這樣才會更好的完善自己的知識架構,提升自己的技術水平,友情推薦“大數據cn”微信公眾號,等你來交流!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。