Hive官方使用手冊——Avro Files
Availability
最早支援AvroSerDe的版本
The AvroSerde is available in Hive 0.9.1 and greater.
概述 – Hive中使用Avro
AvroSerde允許使用者讀取或寫入Avro資料到Hive表。以下是AvroSerde的注意事項:
- 從Avro schema中推斷出Hive表的schema。從Hive 0.14開始,可以從Hive表的schema推斷Avro模式。
- 利用Avro的向後相容效能力,在一個表中以指定的模式讀取所有Avro檔案。
- 支援任意巢狀模式。
- 將所有Avro資料型別轉換為等效的Hive型別。 大多數型別都可以匹配,但是一些Avro型別不存在於Hive中,AvroSerDe會自動轉換。
- 能夠解析壓縮後的Avro檔案。
- 顯式地將可空型別的Avro處理習慣用法Union[T, null] 轉換為只有T,並在適時返回null。
- 將任何Hive表寫入Avro檔案。
- 對於ETL過程的工作,Avro模式依然表現的非常可靠。
- 從Hive 0.14開始,可以使用Alter table語句將列新增到Avro支援的Hive表中。
有關SerDes的一般資訊,請參閱開發指南中的Hive SerDe。還請參閱SerDe,瞭解輸入和輸出處理的詳細資訊。
Requirements
The AvroSerde has been built and tested against Hive 0.9.1 and later, and uses Avro 1.7.5 as of Hive 0.13 and 0.14.
Hive Versions | Avro Version |
---|---|
Hive 0.9.1 | Avro 1.5.3 |
Hive 0.10, 0.11, and 0.12 | Avro 1.7.1 |
Hive 0.13 and 0.14 | Avro 1.7.5 |
Avro to Hive type conversion
While most Avro types convert directly to equivalent Hive types, there are some which do not exist in Hive and are converted to reasonable equivalents. Also, the AvroSerde special cases unions of null and another type, as described below:
Avro type | Becomes Hive type | Note |
---|---|---|
null | void | |
boolean | boolean | |
int | int | |
long | bigint | |
float | float | |
double | double | |
bytes | binary | 在Hive 0.12.0之前,bytes被轉換為陣列[smallint]。 |
string | string | |
record | struct | |
map | map | |
list | array | |
union | union | [T, null]的聯合顯式地轉換可為空的T,其他型別直接轉換為Hive的型別結合。然而,在Hive 7中引入了union,目前還不能在where/group-by語句中使用。從本質上說,他們只是能夠看到。因為AvroSerde顯式地將[T,null]轉換為nullable T,這個限制只適用於多個型別聯合或組合的聯合,而不是單個型別和null。 |
enum | string | Hive沒有enums的概念。 |
fixed | binary | Fixeds在Hive 0.12.0之前被轉換成陣列[smallint]。 |
建立Avro-backed Hive表
使用AvroSerDe可以在Hive中建立avro支援的表。
All Hive versions
建立Avro-backed表,使用org.apache.hadoop.hive.serde2.avro.AvroSerDe指定serde ,指定輸入格式為org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat和輸出格式為org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat。還提供了一個位置,AvroSerde將從該位置提取大部分表的當前模式。例如:
CREATE TABLE kst PARTITIONED BY (ds string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' TBLPROPERTIES ( |
在這個示例中,我們從一個webserver中提取了“真相”閱讀器模式。下面描述了提供這個模式的其他引數。
此表的描述如下:
hive> describe kst; OK string1 string from deserializer string2 string from deserializer int1 int from deserializer boolean1 boolean from deserializer long1 bigint from deserializer float1 float from deserializer double1 double from deserializer inner_record1 struct<int_in_inner_record1: int ,string_in_inner_record1:string> from deserializer enum1 string from deserializer array1 array<string> from deserializer map1 map<string,string> from deserializer union1 uniontype< float , boolean ,string> from deserializer fixed1 binary from deserializer null1 void from deserializer unionnullint int from deserializer bytes1 binary from deserializer |
在這一點上,avo支援的表可以像任何其他表一樣在Hive中工作。
Hive 0.14及以後的版本
從Hive 0.14開始,可以通過在DDL語句中使用“STORED AS AVRO”來建立AVRO支援的表。AvroSerDe負責從Hive表模式中建立合適的Avro模式,這在Hive的Avro可用性方面取得了很大的成功。
例如:
CREATE TABLE kst ( string1 string, string2 string, int1 int , boolean1 boolean , long1 bigint, float1 float , double1 double , inner_record1 struct<int_in_inner_record1: int ,string_in_inner_record1:string>, enum1 string, array1 array<string>, map1 map<string,string>, union1 uniontype< float , boolean ,string>, fixed1 binary, null1 void , unionnullint int , bytes1 binary) PARTITIONED BY (ds string) STORED AS AVRO; |
這個表的描述如下:
hive> describe kst; OK string1 string from deserializer string2 string from deserializer int1 int from deserializer boolean1 boolean from deserializer long1 bigint from deserializer float1 float from deserializer double1 double from deserializer inner_record1 struct<int_in_inner_record1: int ,string_in_inner_record1:string> from deserializer enum1 string from deserializer array1 array<string> from deserializer map1 map<string,string> from deserializer union1 uniontype< float ,
|