Hive 支持多种存储格式,本文我们将了解这些格式的概念。
1、文本文件格式
文件文件(TEXTFILE)格式是Hive中默认的存储格式,在创建Hive 表时如果不指定存储格式即为文本文件。文本文件中每一行数据就是一条记录,可以用任意的分隔符进行分割,也方便和其他的工具进行数据共享、查看和编辑,比如sed,awk等。但相对于二进制文件,文本文件存储的空间较大。
TEXTFILE的数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2、Snappy等使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。
hive> create table cndba(id int);
OK
Time taken: 0.148 seconds
hive> desc cndba;
OK
id int
Time taken: 0.294 seconds, Fetched: 1 row(s)
hive> desc formatted cndba;
OK
# col_name data_type comment
id int
# Detailed Table Information
Database: default
OwnerType: USER
Owner: hdfs
CreateTime: Sat Nov 11 00:56:40 CST 2028
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://nameservice1/user/hive/warehouse/cndba
Table Type: MANAGED_TABLE
Table Parameters:
transient_lastDdlTime 1857488200
# Storage Information
#注意这里的InputFormat和OutputFormat
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
serialization.format 1
Time taken: 0.203 seconds, Fetched: 27 row(s)
hive>
2、SequenceFile 格式
SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以
hive> create table cndba2(id int) stored as sequencefile;
OK
Time taken: 0.162 seconds
hive> desc formatted cndba2;
OK
# col_name data_type comment
id int
# Detailed Table Information
Database: default
OwnerType: USER
Owner: hdfs
CreateTime: Sat Nov 11 01:32:41 CST 2028
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://nameservice1/user/hive/warehouse/cndba2
Table Type: MANAGED_TABLE
Table Parameters:
transient_lastDdlTime 1857490361
# Storage Information
#注意这里的 InputFormat 和OutputFormat
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.SequenceFileInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
serialization.format 1
Time taken: 0.182 seconds, Fetched: 27 row(s)
hive>
3、RCfile 格式
RCFile(Record Columnar File)是另一种高效的二进制文件格式,它是一种列式存储,存储结构遵循的是“先水平划分,再垂直划分”的设计理念。它结合了行存储和列存储的优点:首先,RCFile保证同一行的数据位于同一节点,因此元组重构的开销很低;其次,像列存储一样,RCFile能够利用列维度的数据压缩,并且能跳过不必要的列读取。
hive> create table cndba3 (id int) stored as rcfile;
OK
Time taken: 0.174 seconds
hive> desc formatted cndba3;
OK
# col_name data_type comment
id int
# Detailed Table Information
Database: default
OwnerType: USER
Owner: hdfs
CreateTime: Sat Nov 11 01:38:07 CST 2028
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://nameservice1/user/hive/warehouse/cndba3
Table Type: MANAGED_TABLE
Table Parameters:
transient_lastDdlTime 1857490687
# Storage Information
#注意这里的 InputFormat 和OutputFormat
SerDe Library: org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe
InputFormat: org.apache.hadoop.hive.ql.io.RCFileInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.RCFileOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
serialization.format 1
Time taken: 0.17 seconds, Fetched: 27 row(s)
hive>
4、ORCFile文件格式
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来管理内存使用情况。
hive> create table cndba4(id int) stored as orcfile;
OK
Time taken: 0.188 seconds
hive> desc formatted cndba4;
OK
# col_name data_type comment
id int
# Detailed Table Information
Database: default
OwnerType: USER
Owner: hdfs
CreateTime: Sat Nov 11 01:42:51 CST 2028
LastAccessTime: UNKNOWN
Protect Mode: None
Retention: 0
Location: hdfs://nameservice1/user/hive/warehouse/cndba4
Table Type: MANAGED_TABLE
Table Parameters:
transient_lastDdlTime 1857490971
# Storage Information
#注意这里的 InputFormat 和OutputFormat
SerDe Library: org.apache.hadoop.hive.ql.io.orc.OrcSerde
InputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
Storage Desc Params:
serialization.format 1
Time taken: 0.15 seconds, Fetched: 27 row(s)
hive>
5、SerDe格式
SerDe是序列化/反序列化(Serialize/Deserilize)的简写。 一个SerDe包含了将一条记录的非结构化字节转化成Hive可以使用的一条记录的过程。
- 1、序列化是对象转化为字节序列的过程;
- 2、反序列化是字节码恢复为对象的过程;
序列化的作用主要有两个:
- 1、对象向的持久化;即把对象转换成字节码后保存文件;
- 2、对象数据的传输;
反序列化的主要作用:
- 对
反序列化成Hive table的每一列的值;Hive可以方便的将数据加载到表中而不需要对数据进行转换,这样在海量数据处理时,可以节省大量的时间。
在Hive的HQL语句中,select时将会用到反序列化操作, insert 时会用到序列化操作。
Hive创建表时,通过自定义的SerDe或使用Hive内置的SerDe类型指定数据的序列化和反序列化方式。
常见的SerDe内置类型如下表:
SerDe 类型 | 具体应用 |
---|---|
LazySimpleSerDe: 内置SerDe(org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe) ,用来处理文本文件格式:TEXTFILE | jdbc:hive2://> CREATE TABLE test_serde_lz . . . . . . .> STORED AS TEXTFILE AS . . . . . . .> SELECT name from employee; No rows affected (32.665 seconds) |
ColumnarSerDe: 用来处理 RCFile 的内置 SerDe | jdbc:hive2://> CREATE TABLE test_serde_cs . . . . . . .> ROW FORMAT SERDE . . . . . . .> ‘org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe’ . . . . . . .> STORED ASRCFile AS . . . . . . .> SELECT name from employee No rows affected (27.187 seconds) |
RegexSerDe: 用来处理文本文件的内置 JAVA 正则表达式 SerDe | —Parse , seperate fields jdbc:hive2://> CREATE TABLE test_serde_rex( . . . . . . .> name string, . . . . . . .> sex string, . . . . . . .> age string . . . . . . .> ) . . . . . . .> ROW FORMAT SERDE . . . . . . .> ‘org.apache.hadoop.hive.contrib.serde2.RegexSerDe’ . . . . . . .> WITH SERDEPROPERTIES( . . . . . . .> ‘input.regex’ = ‘([^,]),([^,]),([^,]*)’, . . . . . . .> ‘output.format.string’ = ‘%1$s %2$s %3$s’ . . . . . . .> ) . . . . . . .> STORED AS TEXTFILE; No rows affected (0.266 seconds) |
HBaseSerDe: 内置的 SerDe,可以让 Hive 跟 HBase 进行集成。我们可以利用 HBaseSerDe 来将 Hive 表存储到 HBase 中。 注意:前提是 HBase 已经安装 |
jdbc:hive2://> CREATE TABLE test_serde_hb( . . . . . . .> id string, . . . . . . .> name string, . . . . . . .> sex string, . . . . . . .> age string . . . . . . .> ) . . . . . . .> ROW FORMAT SERDE . . . . . . .> ‘org.apache.hadoop.hive.hbase.HBaseSerDe’ . . . . . . .> STORED BY . . . . . . .> ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’ . . . . . . .> WITH SERDEPROPERTIES ( . . . . . . .> “hbase.columns.mapping”= . . . . . . .> “:key,info:name,info:sex,info:age” . . . . . . .> ) . . . . . . .> TBLPROPERTIES(“hbase.table.name” = “test_serde”); No rows affected (0.387 seconds) |
AvroSerDe: 用来在 Hive 表中读写 Avro 数据格式的内置 SerDe(参考:http://avro.apache.org/) Avro 是一个 RPC 和序列化框架,从 Hive 0.14.0 版本才本地支持 Avro :CREATE TABLE … STORED AS AVRO |
jdbc:hive2://> CREATE TABLE test_serde_avro( . . . . . . .> name string, . . . . . . .> sex string, . . . . . . .> age 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’ . . . . . . .>; No rows affected (0.31 seconds) 需要注意的是,上述方法是 Hive 0.14.0 版本以前的定义方法,如左边所示,我们可以轻松的使用 Stored as Avro 来指定存储为 Avro 格式。 详细内容请参考:https://cwiki.apache.org/confluence/display/Hive/AvroSerDe |
ParquetHiveSerDe: 用来在 Hive 中读写 Parquet 数据格式的内置 SerDe。从 Hive 0.13.0 版本开始本地支持。 | jdbc:hive2://> CREATE TABLE test_serde_parquet . . . . . . .> STORED AS PARQUET AS . . . . . . .> SELECT name from employee; No rows affected (34.079 seconds) |
OpenCSVSerDe: 用来读写 CSV 数据的 SerDe. 从 Hive 0.14.0 版本才发布的。 我们可以通过从 Github 中下载源码进行安装(https://github.com/ogrodnek/csv-serde ) |
jdbc:hive2://> CREATE TABLE test_serde_csv( . . . . . . .> name string, . . . . . . .> sex string, . . . . . . .> age string . . . . . . .>) . . . . . . .> ROW FORMAT SERDE . . . . . . .> ‘org.apache.hadoop.hive.serde2.OpenCSVSerde’ . . . . . . .> STORED AS TEXTFILE; |
JSONSerDe: 这是一个第三方的 SerDe,用来利用 Hive 读取 JSON 数据记录。 你可以通知下载源码进行安装(https://github.com/rcongiu/Hive-JSON-Serde) |
jdbc:hive2://> CREATE TABLE test_serde_js( . . . . . . .> name string, . . . . . . .> sex string, . . . . . . .> age string . . . . . . .> ) . . . . . . .> ROW FORMAT SERDE ‘org.openx.data.jsonserde.JsonSerDe’ . . . . . . .> STORED AS TEXTFILE; No rows affected (0.245 seconds) |
更多关于SerDe内置类型的说明,可以参考官方手册:
http://hive.apache.org/javadocs/r2.1.1/api/overview-summary.html