Hive学习笔记(四)

转载请标明出处:
http://blog.csdn.net/zwto1/article/details/48184019;
本文出自:【明月的博客】

存储格式:

hive从两个维度对表的存储进行处理:行格式和文件格式。
行格式指行和一行中的字段如何存储。
文件格式指一行中字段容器的格式,最简单的是纯文本格式也有面向列和面向行的二进制格式。

默认的存储格式:分隔的文本

创建表没有用ROW FORMAT 和 STORED AS 子句,那么hive默认使用的格式是分隔的文本,每行存储一行数据行。
默认的行内分隔符是 control -A,它出现在字段文本中的可能性比较小。

集合元素的默认分隔符为control-B。它用于分隔ARRAY或STRUCT的元素或MAP的键/值对。
Control-c用于分隔map的键和值。表中各行之间用换行符分隔。
Hive学习笔记(四)_第1张图片

嵌套的层次决定我们使用哪种分隔符。当不确定hive使用哪个字符作为某个嵌套结构的分隔符可以运行下面命令:

create  table nested
as
select  array(array(1,2),array(3,4)) from dummy;

然后使用hexdump命令查看输出文件的分隔符。hive支持6级分隔符,对应ascii编码的1,2…8,只能重载其中的前三个。

create table ...

等价下面的显示说明的语句:

create table row format delimited fields terminated by '\001' collection items terminated by '\002' MAP KEYS terminated by '\003' lines terminated by '\n' stored as textfile;

二进制存储格式 :顺序文件和RCFILE

hadoop的顺序文件格式是一种针对顺序和记录(键值 对)的通用二进制格式。
可以在create table 语句通过 stored as sequencefile来使用顺序文件。
序列文件主要优点:支持 可分割的压缩。
设置几个属性来使用压缩:

set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
insert  overwrite table...;

顺序文件是面向行的,同一行中的字段作为一个顺序文件存储在一起。

RCFILE:
面向列的存储

面向列的存储格式对于只访问表中一小部分行的查询比较有效。
面向行的查询存储格式适合处理一行中很多列的情况。

hive启用面向列的存储:

create table ...
row format serde 'org.apache.hadoop.hive.serde2.columnar.ColumnarSerde'
stored as RCFILE;

eg:使用另一种 SerDe来进行存储。
需求:使用一个功能定制模块SerDe,采用一个正则表达式从一个文本文件中读取定长的观测站元数据:

create table stations(usaf String,wban String,name String) ROW FORMAT serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerde' with serdeproperties( "input.regex"="(\\d{6})(\\d{5})(.{29}).*" );

向表中输入数据:

load data local inpath "input/stations-fixed-width.txt" into table stations;

加载操作不使用表的SerDe
检索数据时,反序列话会调用SerDe,从而使每一行的字段能被正确解析。

select * from stations limit 4;

总结:

主要学习hive的存储格式,hive存储格式分为行格式和文件格式,文件格式包括纯文本格式与面向列和面向行的二进制格式。
分隔的文本格式好处使用其他工具如:mapreduce程序很容易。二进制格式分为面向行的sequencefile和面向列的RCFile。
面向列的存储格式对于只访问表中一小部分行的查询比较有效。面向行的查询存储格式适合处理一行中很多列的情况。

你可能感兴趣的:(hive,hive存储格式)