表存储格式数据类型
表存儲格式&數據類型
Hive表的存儲格式
Hive支持的表類型,或者稱為存儲格式有:TextFile、SequenceFile、RCFile、ORC、Parquet、AVRO。
TextFile
其中TextFile是文本格式的表,它是Hive默認的表結構;在存儲時使用行式存儲,并且默認不進行壓縮,所以TextFile默認是以明文的文本方式進行保存的,但可以手動開啟Hive的壓縮功能進行數據壓縮。
但開啟壓縮后,壓縮后的文件在處理時無法進行split,所以并發度并不高;
因為一個壓縮文件在計算時,會運行一個Map任務進行處理,如果這個壓縮文件較大,處理效率就會降低,但壓縮文件支持再切分的話,在處理時可以Split成多個文件,從而啟動多個Map任務進行并發處理,提升處理性能。
而且對TextFile壓縮文件的解壓,即反序列化為普通文件,必須逐個字符判斷是不是分隔符和行結束符,因此反序列化開銷會比 SequenceFile 高幾十倍。
TextFile表因為采用了行式存儲,所以適合字段較少或者經常需要獲取全字段數據的場景,在數據倉庫場景的分析計算場景中一般不會使用TextFile表;通常ETL流程導入的數據通常為文本格式,使用TextFile表可以很容易的將數據導入到Hive中來,所以它常見的適用場景是作為外部數據導入存儲,或者導出到外部數據庫的中轉表。
SequenceFile
SequenceFile同樣是行式存儲的表,它的存儲格式為Hadoop支持的二進制文件,比如在MapReduce中數據讀入和寫出所使用的<Key、Value>數據,其中Key為讀取數據的行偏移量,Value為SequenceFile真正存儲的數據,所以它在Hadoop中處理時,會減少文件轉換所需要的時間。SequenceFile支持壓縮,可以選擇None、Record、Block三種壓縮方式,默認為Record,壓縮率最高的是Block,而且支持壓縮文件再拆分。所以如果在生產中,需要數據進行行式存儲、原生支持壓縮,且要滿足一定的性能要求,那么可以使用SequenceFile這種存儲方式。
RCFile、ORC、Parquet
RCFile、ORC、Parquet這三種格式,均為列式存儲表——準確來說,應該是行、列存儲相結合。在存儲時,首先會按照行數進行切分,切分為不同的數據塊進行存儲,也就是行存儲;在每一個數據塊中,存儲時使用的又是列式存儲,將表的每一列數據存放在一起。這種列式存儲在大數據技術中尤為常見,它在海量數據場景中是很好的一種優化手段,可以減少數據讀取、移動所花費的時間;因為在結構化數據處理中,一般不會用到全部數據,而是選擇某幾列進行運算,使用行式存儲會將所有數據加載后再進行過濾,而列式存儲可以只讀取這幾列數據,減少數據讀取、處理所需要的時間,這在海量數據場景中可以節約非常多的時間。
列式存儲表中,RCFile現在基本很少使用了,它是ORC表的前身,支持的功能和計算性能都低于ORC表。
ORC表是Hive計算的主要表形式,是在RCFile的基礎上進行了優化和改進,支持NONE、Zlib、Snappy壓縮,在分析計算中的性能較好,是生產中常見的表類型。而且ORC表可以開啟事務功能,以便支持數據更新、刪除等操作,但事務的開啟會影響表的處理性能,所以非必要情況下不需要啟用事務功能。但ORC表的問題在于,它是Hive特有的存儲類型,所以在其它大數據產品中兼容性并不好,有些只有在較高的版本中才會支持。
Parquet表也是Hive計算的主要表形式,它的計算性能稍弱于ORC表,但因為Parquet文件是Hadoop通用的存儲格式,所以對于其它大數據組件而言,具有非常好的數據兼容度;而且Parquet表可以支持數據的多重嵌套(如JSON的屬性值可以是一個對象,且支持嵌套),但ORC表在多重嵌套上的性能并不好。Parquet支持uncompressed\snappy\gzip\lzo壓縮,其中lzo壓縮方式壓縮的文件支持切片,意味著在單個文件較大的場景中,處理的并發度會更高;而ORC表的壓縮方式不支持切分,如果單個壓縮文件較大的話,性能會有影響。
所以,對于ORC表和Parquet表的選擇要區分使用場景,如果只在Hive中處理時使用,追求更高效的處理性能,且單個文件不是很大,或者需要有事務的支持,則選用ORC表。但如果要考慮到與其它大數據產品的兼容度,且單個文件較為龐大,數據存在多重嵌套,則選用Parquet表。
AVRO
最后AVRO表,它主要為 Hadoop 提供數據序列化和數據交換服務,支持二進制序列化方式,它與Thrift功能類似。一般而言,在數據傳輸中,不會直接將文本發送出去,而是先要經過序列化,然后再進行網絡傳輸,AVRO就是Hadoop中通用的序列化和數據交換標準。所以,如果數據通過其他Hadoop組件使用AVRO方式傳輸而來,或者Hive中的數據需要便捷的傳輸到其他組件中,使用AVRO表是一種不錯的選擇。
常見表類型選擇
Hive在生產中,一般使用較多的是TextFile、Orc、Parquet。TextFile一般作為數據導入、導出時的中轉表。ORC和Parquet表一般作為分析運算的主要表類型,如果需要支持事務,則使用ORC,如果希望與其它組件兼容性更好,則使用Parquet。
在性能上ORC要略好于Parquet。但Parquet支持壓縮切分,有時候也是考慮因素。
當然除了這幾種內置表,Hive還支持自定義存儲格式。可通過實現 InputFormat 和 OutputFormat 來完成。
壓縮方式
Hive內置的壓縮方式有bzip2、deflate、gzip,支持的第三方壓縮方式有lzo、snappy。標準壓縮方式為deflate,其算法實現是zlib。
其中bzip2、lzo支持壓縮后文件再拆分。
對于這幾種壓縮算法,按照壓縮比的排名順序為:bzip2 > gzip > deflate > snappy > lzo。所以如果想保證高壓縮率,那可以選用bzip2、gzip,但相應的壓縮/解壓縮的時間也會很長。相反的,按照壓縮/解壓縮耗時排名,順序正好相反:lzo < snappy < deflate < gzip < bzip2,所以如果追求處理效率,則可以使用lzo、snappy進行壓縮。
這里對壓縮方式,僅做簡單的了解即可。
數據類型
基本數據類型
數值型
Hive數值型包含整數、浮點數兩種。
整數類型有:tinyint、smallint、int/integer、bigint,默認為int/integer,或者使用后綴進行整數類型的標識:100Y、100S、100L(對應為 tinyint、smallint、bigint)。
浮點類型有:float、double/double precision、decimal/numeric,金融級別數據會使用decimal保證數據精度。
decimal數據類型使用構造函數decimal (precision, scale)進行創建,precision是數字部分(整數+小數)的整體長度, scale是小數部分的長度。如果不進行指定,數字部分默認長度為 10,小數部分如果沒有指定,則默認為 0。
一般數據類型在建表時,在表字段后指定;但為了方便演示,使用了CAST函數進行了數據類型轉換,將其它類型數據轉換為DECIMAL類型。執行SQL前,先保證HiveServer2和MetaStore已經啟動,并使用beeline客戶端連接到hive。
--將float類型的123.5轉換為decimal類型 select CAST(123.56 AS DECIMAL(4,1)); > 123.5小數部分超出指定長度后,會被四舍五入截取,相當于精度截取。
select CAST(123456.5 AS DECIMAL); > 123457整數部分超出指定長度后,直接轉換為NULL值,相當于數據溢出。
select CAST(12345678910.5 AS DECIMAL); > NULL可以將其它數據類型轉換為decimal,數據超出部分按照規則進行截取。
select CAST('123456789.1234567' AS DECIMAL(20,5)); 123456789.12346字符型
Hive字符型包含可變長度字符串、固定長度字符串兩種??勺冮L度字符串有:string、varchar;固定長度字符串有:char。
其中varchar需要指定最大字符數(1-65535),超過則會被自動截斷,而string會自動進行擴展;但varchar和string,末尾如果存在空格,則會影響字符串的比較結果。
select CAST("ABCDEFGHIGK" AS VARCHAR(10)); > ABCDEFGHIG select CAST("ABCDEFGHIGK" AS STRING); > ABCDEFGHIGKchar需要指定最大字符串(1-255),小于指定長度的值會被空格填充,末尾存在空格,并不影響字符串的比較結果。
select CAST("ABCDEFGHIGK" AS CHAR(10)); > ABCDEFGHIG日期型
Hive支持的日期類型有:TIMESTAMP、DATE、INTERVAL。
TIMESTAMP可以存儲整型、浮點型、字符串類型的時間數據。
整型、浮點型支持以毫秒為單位的UNIX時間戳。
select CAST(1610493629000 AS TIMESTAMP); > 2021-01-13 07:20:29.0字符串,支持YYYY-MM-DD HH:MM:SS.fffffffff 格式,可達到小數點后9位精度(納秒級別)。
select CAST('2021-01-13 07:20:29' AS TIMESTAMP); > 2021-01-13 07:20:29.0對于TIMESTAMP,提供用于時區轉換的UDF函數:to_utc_timestamp,from_utc_timestamp。
select to_utc_timestamp(1610493629000, 'GMT'); > 2021-01-13 07:20:29.0所有日期時間的UDF都能夠使用TIMESTAMP數據類型。
Date類型在0.12.0后支持,格式為YYYY--MM--DD,可以表示從0000--01--01到9999--12--31的日期。Date只能從Date、Timestamp、String類型中轉換而來。
select cast(CAST('2021-01-13 07:20:29' AS TIMESTAMP) as date); select cast('2021-01-13' as date); select cast(cast('2021-01-13' as date) as date);Intervals是指一段以年、月、日、分鐘、秒為單位的時間片段。
在2.2.0版本之前,僅支持字符串表示時間片段,但2.2.0后可以使用數字常量直接表示,或者直接省略INTERVAL關鍵字,使用別名進行表示。如INTERVAL ‘1’ DAY等同于INTERVAL 1 DAY,也可以使用1 DAYS進行表示。
Intervals一般用于時間的計算。
# 在當前時間的基礎上,增加1年、2個月、1天 # 2.2.0之前 select current_timestamp() + INTERVAL '1' year + INTERVAL '2' MONTH + INTERVAL '1' DAY; # 2.2.0之后 select current_timestamp() + INTERVAL 1 year + INTERVAL 2 MONTH + INTERVAL 1 DAY; select current_timestamp() + 1 years + 2 months + 1 days;Intervals支持格式化字符串,用于表示組合的時間片段,但支持有限。
--表示1年2個月 select INTERVAL '1-2' YEAR TO MONTH; --表示1天2小時3分鐘4秒5納秒 select INTERVAL '1 2:3:4.000005' DAY TO SECOND;Intervals僅支持年、月進行組合,天、小時、分鐘、秒、納秒進行組合,不支持類似月、天這樣的組合,但因為組合的時間片段使用場景非常有限,一般在時間計算中會直接對多個INTERVAL片段進行運算,所以不影響實際使用。
Intervals在2.2.0版本中,支持動態時間間隔、關鍵字省略,方便了在特定場景中的使用。
select INTERVAL (1+2) MONTH; select 1 DAY;其它類型(Misc Type)
在基本數據類型中,還有BOOLEAN、BINARY。
當然,對于缺失的數據值,會被標記為NULL。
復雜數據類型
Hive支持復雜數據類型array、map、struct、union。
數據類型比較
對于這些數據類型,僅需要在使用時進行參考即可。但Hive作為數據倉庫,數據更多的時候是從其它數據庫或數據倉庫中導入的,所以就需要進行數據類型的轉換。
其中JDBC與Hive數據類型的對照關系如下圖所示:
接下來是Orcale與Hive的數據類型對照:
除此之外,DB2也是常見的數據庫,DB2與Hive的數據類型對照如下:
對于這些數據類型,在需要使用的時候,直接進行參考對照即可。
總結
- 上一篇: 架构师小跟班:SSL证书免费申请及部署,
- 下一篇: gaitset全代码实现问题总结