签到成功

知道了

CNDBA社区CNDBA社区

Hive 存储格式 说明

2019-05-14 00:26 3349 0 转载 Hive
作者: dave

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 提供的一种二进制文件,它将数据以 的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。SequenceFile 可以在块级别和行记录级别进行压缩,同时支持按照块级别的文件分割。 https://www.cndba.cn/dave/article/3405

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能够利用列维度的数据压缩,并且能跳过不必要的列读取。

https://www.cndba.cn/dave/article/3405

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相比,具有以下一些优势: https://www.cndba.cn/dave/article/3405

  • 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可以使用的一条记录的过程。https://www.cndba.cn/dave/article/3405

  • 1、序列化是对象转化为字节序列的过程;
  • 2、反序列化是字节码恢复为对象的过程;

序列化的作用主要有两个:https://www.cndba.cn/dave/article/3405

  • 1、对象向的持久化;即把对象转换成字节码后保存文件;
  • 2、对象数据的传输;

反序列化的主要作用:

  • 反序列化成Hive table的每一列的值;Hive可以方便的将数据加载到表中而不需要对数据进行转换,这样在海量数据处理时,可以节省大量的时间。

在Hive的HQL语句中,select时将会用到反序列化操作, insert 时会用到序列化操作。

Hive创建表时,通过自定义的SerDe或使用Hive内置的SerDe类型指定数据的序列化和反序列化方式。https://www.cndba.cn/dave/article/3405

常见的SerDe内置类型如下表:

https://www.cndba.cn/dave/article/3405

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

https://www.cndba.cn/dave/article/3405

https://www.cndba.cn/dave/article/3405

https://www.cndba.cn/dave/article/3405

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2249
    原创
  • 3
    翻译
  • 573
    转载
  • 191
    评论
  • 访问:7505806次
  • 积分:4303
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ