1. Hive文件与记录格式

Create table 有多种用法,例如STORED AS SEQUENCEFILE, ROW FORMAT DELIMITED, SERDE, INPUTFORMAT, OUTPUTFORMAT 这些语法。

某些语法是其他语法的快捷用法,例如:

语法 STORED AS SEQUENCEFILE 的替代方式是:指定INPUTFORMAT 为 org.apache.hadoop.mapred.SequenceFileInputFormat,并指定 OUTPUTFORMAT 为 org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat。

下面创建一些表,然后使用 DESCRIBE TABLE EXTENDED 语句查看下内部实际变化情况。首先创建一个简单表:

> create table text(x int);

hive> describe extended text;

OK

x                       int

Detailed Table Information

Table(tableName:text, dbName:default, owner:hadoop, createTime:1559016716, lastAccessTime:0, retention:0,

sd:StorageDescriptor(

cols:[FieldSchema(name:x, type:int, comment:null)],

location:hdfs://ip-10-0-2-70.cn-north-1.compute.internal:8020/user/hive/warehouse/text,

inputFormat:org.apache.hadoop.mapred.TextInputFormat,

outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat,

compressed:false,

numBuckets:-1,

serdeInfo:SerDeInfo(

name:null,

serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe,

parameters:{serialization.format=1}

),

bucketCols:[], sortCols:[], parameters:{},

skewedInfo:SkewedInfo(

skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}

),

storedAsSubDirectories:false),

partitionKeys:[], parameters:{totalSize=0, numRows=0, rawDataSize=0, COLUMN_STATS_ACCURATE={"BASIC_STATS":"true"}, numFiles=0, transient_lastDdlTime=1559016716},

viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE, rewriteEnabled:false)

Time taken: 0.132 seconds, Fetched: 3 row(s)

然后再使用 STORED AS DEQUENCEFILE 语句创建一张表,用于对比:

> create table seq(x int) stored as sequencefile;

> describe extended seq;

OK

x                       int

Detailed Table Information

Table(tableName:seq, dbName:default, owner:hadoop, createTime:1559017290, lastAccessTime:0, retention:0,

sd:StorageDescriptor(

cols:[FieldSchema(name:x, type:int, comment:null)],

location:hdfs://ip-10-0-2-70.cn-north-1.compute.internal:8020/user/hive/warehouse/seq,

inputFormat:org.apache.hadoop.mapred.SequenceFileInputFormat,

outputFormat:org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat,

compressed:false, numBuckets:-1,

serdeInfo:SerDeInfo(

name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe,

parameters:{serialization.format=1}

),

bucketCols:[], sortCols:[], parameters:{},

skewedInfo:SkewedInfo(

skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}

),

storedAsSubDirectories:false

),

partitionKeys:[], parameters:{totalSize=0, numRows=0, rawDataSize=0, COLUMN_STATS_ACCURATE={"BASIC_STATS":"true"}, numFiles=0, transient_lastDdlTime=1559017290}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE, rewriteEnabled:false)

两者差异很明显:STORED AS SEQUENCEFILE 与默认的InputFormat 和 OutputFormat的值不一样:

inputFormat:org.apache.hadoop.mapred.TextInputFormat,

outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat,

inputFormat:org.apache.hadoop.mapred.SequenceFileInputFormat,

outputFormat:org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat,

在从表中读取数据时,Hive 会使用InputFormat,在向表写入数据时,会使用OutputFormat。InputFormat会从文件中读取key-value对。默认情况下,Hive会直接忽略掉key的内容,而是只有value中的数据。因为key来自于TextInputFormat,是每行的字节偏移量,并不是用户的数据。

2.文件格式

Hive中最简单的数据格式是文本文件格式,可以使用任意分隔符进行分割,同时它也是默认的文件格式,等价于:在创建时通过STORED AS TEXTFILE 语句指定使用文本存储格式

文本文件便于与其他工具共享数据,也便于查看和编辑。不过,相对于二进制文件,文本文件存储的空间要大。我们可以使用压缩,但是如果使用二进制文件存储格式的话,则既可以节约存储空间,也可以提高I/O性能。

2.1 SequenceFile

其中一种存储格式是SequenceFile文件存储格式,在定义表结构时可以通过STORED AS SEQUENCEFILE 语句指定。SequenceFile 是Hadoop生态系统中支持的标准文件格式,可以在块级别和记录级别进行压缩,这对于优化磁盘利用率和I/O来说非常有意义。同时仍然可以支持按照块级别的文件分割,以方便并行处理。Hive 所支持的另一个高效二进制文件是RCFile

2.2 RCFile

大多数Hadoop和Hive都是行式存储的,大多数场景下,这是比较高效的。高效的原因有:

1.     大多数的表具有的字段个数都不大(一般1到20个字段)

2.     对文件按块进行压缩对于需要处理重复数据的情况比较高

3.     很多的处理和调试工具(例如more、head、awk)都可以很好地应用于行式存储数据

但是对于某些特定类型的数据和应用,列式存储会更适用。例如,表中有成百上千个字段,但是大多数查询仅使用其中小部分字段,这时扫描所有的行和过滤掉大部分数据显然是很浪费的。如果数据存储是列式存储,那么仅扫描需要的列数据就可以提高性能。

对于列式存储,进行压缩通常会非常高效,特别是在这列的数据具有较低计数的时候。同时,一些列式存储并不需要物理存储null值的列。

基于这些场景,Hive中设计了RCFile。

Hive 另外一个优点是:可以很容易地在不同的存储格式间转换数据。对一个表执行一个SELECT查询时,或是向表写入执行INSERT操作时,Hive会使用这个表的metadata信息,自动执行转换过程,而不需要额外的程序来对不同存储格式进行转换。

这里我们举一个例子,首先使用ColumarSerDe、RCFileInputFormat和RCFileOutputFormat参数创建表:

> select * from a;

OK

4       5

3       2

> create table columnTable(key int, value int)

> ROW FORMAT SERDE

> 'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe'

> STORED AS

> INPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileInputFormat'

> OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.RCFileOutputFormat';

OK

hive> FROM a INSERT OVERWRITE TABLE columnTable SELECT a.key, a.value;

对于 RCFile 来说,无法使用通常工具打开RCFile,也无法使用通常打开SequenceFile的工具打开。例如:

>cat 000000_0

RCF    hive.io.rcfile.column.number2Ч];E3:'c
     
  
4352

不过Hive 提供了一个rcfilecat工具,用于展示RCFile文件内容:

> hive --service rcfilecat /user/hive/warehouse/columntable/000000_0

4       5

3       2

3. 记录格式:SerDe

SerDe是Serializer/Deserializer的简称。一个SerDe允许Hive从一个表读入数据,并以任意用户定义的格式写回HDFS。它包含了将一条记录的非结构化数据转化成Hive可以使用的一条记录的过程。

Hive SerDe 库在 org.apache.hadoop.hive.serde2 中(旧版本的SerDe 库在 org.apache.hadoop.hive.serde中,已经被弃用),它本身包含了一些内置的SerDes,如:

1.     Avro(Hive 0.9.1 及之后版本)

2.     ORC(Hive 0.11 及之后版本)

3.     RegEx

4.     Thrift

5.     Parquet(Hive 0.13及之后版本)

6.     CSV(Hive 0.14及之后版本)

7.     JsonSerDe(Hive 0.12 及之后版本,在hcatalog-core中)

需要注意的是:在Hive 0.12 之前的发行版中,Amazon提供了一个JSON SerDe,位于s3://elasticmapreduce/samples/hive-ads/libs/jsonserde.jar

也有用户定义的SerDes,不过需要用户实现,或是使用第三方的SerDe。

 

SerDe的用途与过程有以下三点:

·       Hive 使用SerDe(以及FileFormat)读写表中的行

·       HDFS文件 --> InputFormat --> <key, value> --> Deserializer --> Row object

·       Row object --> Serializer --> <key, value> --> OutputFormat --> HDFS files

这里需要注意的是:这里的key部分在读入后是被忽略掉的(因为key来自于TextInputFormat,是每行的字节偏移量,并不是用户的数据),基本上行对象是存在value中的。

在内部,Hive 引擎使用定义的InputFormat来读取一行条目,然后此记录会被传递给SerDe.Deserializer() 方法进行处理。

以JSON SerDe为例,如果用户想使用Hive 查询JSON格式的数据。若是不使用SerDe,且每行为一个json“文件”的话,则可以在使用TextInputFormat 读入,然后使用一个JSON的SerDe 将JSON文档作为一条记录进行解析。例如:

>  create external table messages(

>    id int,

>    message string

>   )

>   row format serde "org.apache.hive.hcatalog.data.JsonSerDe"

>  location 's3://tang-emr/jsonserde/'

>  ;

JSON数据为:

{"id":1,"message":"yep"}

{"id":2,"message":"asdf"}

{"id":3,"message":"cddacddc","fa":"asf"}

hive> select * from messages;

OK

1       yep

2       asdf

3       cddacddc

References:

1. Hive 编程指南

2. https://cwiki.apache.org/confluence/display/Hive/SerDe

Hive文件与记录格式的更多相关文章

  1. 自定义hive文件和记录格式及文本文件数据编码

    (1)一段 建表语句: [ROW FORMAT row_format] [STORED AS file_format] | STORED BY 'storage.handler.class.name' ...

  2. Hive文件存储格式

    hive文件存储格式 1.textfile textfile为默认格式   存储方式:行存储   磁盘开销大 数据解析开销大   压缩的text文件 hive无法进行合并和拆分 2.sequencef ...

  3. Hive文件存储格式和hive数据压缩

    一.存储格式行存储和列存储 二.Hive文件存储格式 三.创建语句和压缩 一.存储格式行存储和列存储 行存储可以理解为一条记录存储一行,通过条件能够查询一整行数据. 列存储,以字段聚集存储,可以理解为 ...

  4. Hive文件的存储格式

    hive文件存储格式包括以下几类: TEXTFILE SEQUENCEFILE RCFILE 自定义格式 其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到h ...

  5. HIVE文件

    注册表的本地实体文件, 察看位置,以及映射本地文件到注册表中的位置, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist 在这里写 ...

  6. 【图解】Hive文件存储格式

    摘自:https://blog.csdn.net/xueyao0201/article/details/79103973 引申阅读原理篇: 大数据:Hive - ORC 文件存储格式 大数据:Parq ...

  7. 读取hive文件并将数据导入hbase

    package cn.tansun.bd.hbase; import java.io.IOException; import java.net.URI; import java.util.List; ...

  8. HIVE SQL产生的文件数量及参数调优

    产生背景:sqoop抽取oracle数据到hive表时,只能写入到固定分区(--hive-partition-key #hive分区字段 --hive-partition-value #hive分区值 ...

  9. 启动hive,提示ls: 无法访问/home/software/spark-2.0.1-bin-hadoop2.7/lib/spark-assembly-*.jar: 没有那个文件或目录

    原因是:spark升级到spark2以后,原有lib目录下的大JAR包被分散成多个小JAR包,原来的spark-assembly-*.jar已经不存在,所以hive没有办法找到这个JAR包. 解决办法 ...

随机推荐

  1. 通过编写Java代码让Jvm崩溃

    在书上看到一个作者提出一个问题"怎样通过编写Java代码让Jvm崩溃",我看了之后也不懂.带着问题查了一下,百度知道里面有这样一个答案: 1 package jvm; 2 3 pu ...

  2. github下载总是失败解决

    解决访问github等网站慢或下载失败的问题 第二种方法可以使用

  3. 开学第一课Java考试

    package moguiba;import java.text.DecimalFormat;import java.util.Scanner;import moguiba.ScoreInformat ...

  4. 论文阅读笔记(十二)【CVPR2018】:Exploit the Unknown Gradually: One-Shot Video-Based Person Re-Identification by Stepwise Learning

    Introduction (1)Motivation: 大量标记数据成本过高,采用半监督的方式只标注一部分的行人,且采用单样本学习,每个行人只标注一个数据. (2)Method: 对没有标记的数据生成 ...

  5. Python标准库之re模块

    re模块用于正则表达式. 正则表达式在线测试:http://c.runoob.com/front-end/854 正则表达式元字符可以参考:https://www.w3cschool.cn/zheng ...

  6. 为什么 MySQL 使用 B+ 树

    为什么 MySQL 使用 B+ 树是面试中经常会出现的问题,很多人对于这个问题可能都有一些自己的理解,但是多数的回答都不够完整和准确,大多数人都只会简单说一下 B+ 树和 B 树的区别,但是都没有真正 ...

  7. mybatis第二天01

    MyBatis第二天01 1.高级结果映射 1.1根据视频案例,分析表之间的关系 数据模型分析 1. 明确每张表存储的信息 2. 明确每张表中关键字段(主键.外键.非空) 3. 明确数据库中表与表之间 ...

  8. pytorch深度学习书、论坛和比赛地址

    pytorch深度学习书.论坛和比赛地址 待办 https://zhuanlan.zhihu.com/p/85353963 http://zh.d2l.ai/ https://discuss.gluo ...

  9. Java期末考试冲刺总结

    经过长达将近三个小时的冲刺,我感觉身心俱疲,但它无法掩盖我敲代码的欲望! 三个小时我只实现了公文流转系统的的部分功能. 我深刻的意识到建民老师说的这套关系之复杂,它真的是太复杂了!!!没有系统的梳理, ...

  10. @RendSection{"scripts",require:false}的作用

    MVC视图中,Javascripts代码被放于下面的Razor代码中(@section Scripts{}). 好处:在视图进行JavaScript编程时,是一个很好的实践,在共享视图(_Layout ...