命中表的源文件存储格式有几种:

1、文本文件

创建表时未指定默认格式。导入数据时,会将数据文件直接复制到hdfs进行处理。源文件可以直接通过hadoop fs-cat查看

2、SEQUENCEFILE是Hadoop API提供的二进制文件,使用方便、可分离、可压缩。

SEQUENCEFILE 将数据以 <key, value> 的形式序列化成文件。序列化和反序列化是使用 Hadoop 的标准 Writable 接口实现的。 key 为空,value 用于存储实际值,从而避免了 map 阶段的排序过程。

三种压缩选项:NONE、RECORD、BLOCK。记录压缩率低。通常建议使用 BLOCK 压缩。使用时设置参数。

设置 hive.exec.compress.outputu003dtrue;

设置 io.seqfile.compression.typeu003d块; -- 无/记录/块

创建表 test2(str STRING) 存储为 SEQUENCEFILE;

3、RC文件

一种结合行存储和列存储的存储方法。首先,它将数据划分为行,以确保同一条记录在一个块上,避免读取一个记录需要读取多个块。其次,块数据列存储有利于数据压缩和快速列访问。

理论上查询效率高(但是hive官方说效果不明显,只节省10%的存储空间,所以不好用,不能用)。

RCFile结合了行存储快速查询和列存储节省空间的特点

1)同一行的数据位于同一个节点,所以元组重构的成本很低。

2)块内列存储,可以压缩列维度数据,跳过不必要的列读取。

在查询过程中,不关心的列在 IO 上被跳过。实际过程是在map阶段,还是把整块数据从远程拷贝到本地目录。它并不是直接跳过列,而是通过扫描每个行组的标题定义。

但是,整个 HDFS Block 级别的 header 并没有定义每列从哪个行组开始到哪个行组结束。因此,当读取所有列时,RCFile 的性能不如 SequenceFile。

4、ORC hive给出的新格式属于RCFILE的升级版。

5.当前Hive无法识别用户自定义格式的数据文件格式。实现输入格式和输出格式时,自定义输入输出格式。

参考代码:hive-0.8.1 src contrib src java org apache hadoop hive contrib fileformat Base64

见http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843318.html

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

zoz100027 20

  • 21

  • 22

  • 23

  • 24

  • 25

注意:

只有 TEXTFILE 表可以直接加载数据。本地加载数据只需要使用TEXTFILE表,直接加载路径数据需要外部表。

另外,hive默认支持的压缩文件(hadoop默认支持的压缩格式)只能直接从TEXTFILE表中读取。其他格式不起作用。插入可以通过 TEXTFILE 表加载到其他表中。

也就是说,SequenceFile 和 RCFile 表不能直接加载数据。数据要先导入到textfile表中,再通过insert select从textfile表中导入到SequenceFile,RCFile表中。

SequenceFile和RCFile表的源文件不能直接查看,但是可以在hive中用select查看。 RCFile源文件可以用hive--service rcfilecat / XXXXXXXXXXXXXXXXXXXXXXX / 000000_0查看,但是格式不同,比较乱。

hive默认支持压缩文件格式,参考http://blog.csdn.net/longshenlmj/article/details/50550580

  • 1

  • 2

  • 3

zoz100036 4

zoz100037 5

  • 6

  • 7

  • 8

ORC格式

ORC是RCfile的升级版,性能有了很大的提升。

并且可以对数据进行压缩存储,压缩率类似于Lzo压缩,文本文件的压缩率可以达到70%的空间。而且读取性能非常高,可以实现高效的查询。

具体介绍https://cwiki.apache.org/confluence/display/Hive/Language Manual+ORC

TABLE 语句如下:

同时ORC表中的NULL由默认的N改为''。

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

一种方式

如果不存在则创建表 test_orc(

广告商_id 字符串,

ad_plan_id 字符串,

cnt BIGINT

) 由 (day string, type TINYINT COMMENT '0 as bid, 1 as win, 2 as ck', hour TINYINT) 分区

存储为兽人;

更改表测试_orc 设置 serdeproperties('serialization.null.format' u003d '');

//查看结果

蜂巢> 显示创建表测试_orc;

创建表 `test_orc`(

`advertiser_id`字符串,

`ad_plan_id`字符串,

`cnt`大整数)

由 (

`day`字符串,

`type`tinyint COMMENT '0 为出价,1 为中奖,2 为 ck',

`hour`小整数)

行格式分隔

NULL 定义为 ''

存储为输入格式

'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'

输出格式

'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

位置

'hdfs://namenode/hivedata/warehouse/pmp.db/test_orc'

TBL 属性 (

'last\modified\by'\u003d'pmp_bi',

'最后\修改\时间'\u003d'1465992624',

'瞬态_lastDdlTime'\u003d'1465992624')

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

zoz100057 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

zoz100069 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

zoz100077 30

  • 31

  • 32

方式二

删除表测试_orc;

如果不存在则创建表 test_orc(

广告商_id 字符串,

ad_plan_id 字符串,

cnt BIGINT

) 由 (day string, type TINYINT COMMENT '0 as bid, 1 as win, 2 as ck', hour TINYINT) 分区

行格式SERDE

'org.apache.hadoop.hive.ql.io.orc.OrcSerde'

带有 serdeproperties('serialization.null.format' u003d '')

存储为兽人;

//查看结果

蜂巢> 显示创建表测试_orc;

创建表 `test_orc`(

`advertiser_id`字符串,

`ad_plan_id`字符串,

`cnt`大整数)

由 (

`day`字符串,

`type`tinyint COMMENT '0 为出价,1 为中奖,2 为 ck',

`hour`小整数)

行格式分隔

NULL 定义为 ''

存储为输入格式

'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'

输出格式

'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

位置

'hdfs://namenode/hivedata/warehouse/pmp.db/test_orc'

TBL 属性 (

'瞬态_lastDdlTime'\u003d'1465992726')

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

  • 31

  • 32

  • 33

模式三

删除表测试_orc;

如果不存在则创建表 test_orc(

广告商_id 字符串,

ad_plan_id 字符串,

cnt BIGINT

) 由 (day string, type TINYINT COMMENT '0 as bid, 1 as win, 2 as ck', hour TINYINT) 分区

行格式分隔

NULL 定义为 ''

存储为兽人;

//查看结果

蜂巢> 显示创建表测试_orc;

创建表 `test_orc`(

`advertiser_id`字符串,

`ad_plan_id`字符串,

`cnt`大整数)

由 (

`day`字符串,

`type`tinyint COMMENT '0 为出价,1 为中奖,2 为 ck',

`hour`小整数)

行格式分隔

NULL 定义为 ''

存储为输入格式

'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'

输出格式

'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

位置

'hdfs://namenode/hivedata/warehouse/pmp.db/test_orc'

TBL 属性 (

'瞬态_lastDdlTime'\u003d'1465992916')

Logo

开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品

更多推荐