HIVE STORED&Row format
hive表数据在存储在文件系统上的,因此需要有文件存储格式来规范化数据的存储,一边hive写数据或者读数据。hive有一些已构建好的存储格式,也支持用户自定义文件存储格式。主要由两部分内容构成file_format和row_format,两者息息相关,在create table语句中结构如下:
[ROW FORMAT row_format]
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later)
]
row_format
: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char] -- (Note: Available in Hive 0.13 and later)
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
file_format:
: SEQUENCEFILE
| TEXTFILE -- (Default, depending on hive.default.fileformat configuration)
| RCFILE -- (Note: Available in Hive 0.6.0 and later)
| ORC -- (Note: Available in Hive 0.11.0 and later)
| PARQUET -- (Note: Available in Hive 0.13.0 and later)
| AVRO -- (Note: Available in Hive 0.14.0 and later)
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
这里会涉及到STORED AS语法,实际上STORED AS file_format语法源于HIVE 0.14中出现的注册机制
,将{SerDe, InputFormat, and OutputFormat}三者绑定到STORED AS file_format语法从而更加便捷,也可以不包含SerDe,这样对于某些file_format,用户可以指定使用那个serde,从而更加多样化。
我们首先要理清InputFormat、OutputFormat与SerDe三者间的关系,直接引用官方的说法:
SerDe is a short name for “Serializer and Deserializer.”</br>
Hive uses SerDe (and !FileFormat) to read and write table rows.</br>
HDFS files –> InputFileFormat –> <key, value> –> Deserializer –> Row object</br>
Row object –> Serializer –> <key, value> –> OutputFileFormat –> HDFS files</br>
Note that the "key" part is ignored when reading, and is always a constant when writing. Basically row object is stored into the "value".</br>
从上边解释,不难理解三者之间的关系,下面对file_format和对应的serde进行分别介绍
STORED AS TEXTFILE
实际上等于:
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
作为纯文本文件存储,TEXTFILE默认是hive的默认存储方式,用户可以通过配置 hive.default.fileformat 来修改。STORED AS TEXTFILE中没有指定使用Serde,STORED AS TEXTFILE一般配合ROW FORMAT DELIMITED来使用,实际上若是没有指定ROW FORMAT或者使用了ROW FORMAT DELIMITED,则将使用自带的一个SerDe:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe,因此ROW FORMAT DELIMITED语句实际上就是向LazySimpleSerDe传参数。与row format serde org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe with SERDEPROPERTIES(…)类似。文本文件实际上由各种分隔符定义。FIELDS TERMINATED BY char,定义了字段分割符,LINES TERMINATED BY char定义了行分隔符。使用ESCAPED BY语句来指定转义字符,例如 ESCAPED BY ‘\’,如果你的数据中含有这些转义字符,则需要指定转义字符。null值可以使用NULL DEFINED AS来进行定义(默认为’\N’)。
STORED AS SEQUENCEFILE
实际上等于:
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.mapred.SequenceFileOutputFormat'
存储为压缩的序列化文件。是hadoop中的标准序列化文件,可压缩,可分块。SequenceFile是一个由二进制序列化过的key/value的字节流组成的文本存储文件,它可以在map/reduce过程中的input/output 的format时被使用。在map/reduce过程中,map处理文件的临时输出就是使用SequenceFile处理过的。SequenceFile可以作为小文件的容器,可以通过它将小文件包装起来传递给MapReduce进行处理(即将文件名作为key,文件内容作为value序列化到大文件中)。
SequenceFile 有三种压缩态:
1.Uncompressed – 未进行压缩的状
2.record compressed - 对每一条记录的value值进行了压缩(文件头中包含上使用哪种压缩算法的信息)
3