HIVE STORED&Row format(四)

本文详细介绍了HIVE的多种存储格式,包括TEXTFILE、SEQUENCEFILE、RCFILE、ORC、PARQUET和AVRO,以及它们的特性、压缩方式和与SerDe的关系。STORED AS语法简化了文件格式与SerDe的绑定,而INPUTFORMAT和OUTPUTFORMAT定义了数据的输入输出处理方式。此外,文章还提到了STORED BY StorageHandler用于创建或链接非本地表,如HBASE等。通过对这些存储格式的理解,可以更好地优化HIVE表的数据存储和查询效率。
摘要由CSDN通过智能技术生成

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值