转载请标明出处:
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使用哪个字符作为某个嵌套结构的分隔符可以运行下面命令:
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;
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。
面向列的存储格式对于只访问表中一小部分行的查询比较有效。面向行的查询存储格式适合处理一行中很多列的情况。