Hive作为一款构建于Hadoop之上的数据仓库系统,具有良好的异构数据源普遍适用性。Hive内部处理的是记录(Row),任何数据在被Hive处理之前都需要经过Hive的输入接口转成记录(Row)。在Hive中创建表后,Hive在MetaStore中为表存储了必要的元信息,其中有三项元信息用于指定外部数据的输入输出方式。
1)InputFormat。这项元信息是一个实现了Hadoop的数据输入接口(org.apache.hadoop.mapred.InputFormat)的Java类的名称。该实现类将来自外部数据源的数据转换成一系列的Key-Value对,这些Key-Value对的Value部分在后面被Hive用来生成记录。
2)SerDe。这项元信息是一个实 现了Hive中的org.apache.hadoop.hive.serde2.SerDe接口的Java类的名称。Hive从InputFormat获得的各个Key-Value对的Value部分是原始的Writable对象。而由SerDe指定的Java类负责将这些Writable对象转换成可在Hive内部处理的记录(Row),还负责将记录(Row)还原为原始的Writable对象。
3)OutputFormat。这项元信息是一个实现了Hadoop的数据输出接口(org.apache.hadoop.mapred.OutputFormat)的Java类的名称。从记录(Row)还原而来的Writable对象被进一步封装成Key-Value对,然后经过OutputFormat指定的Java类输出到外部数据源。
以上三项信息要么在建表时显式指定,要么由Hive赋缺省值。Hive用来存储记录数据的两种常用文件格式:文本文件和RCFile。
若按文本文件存储,元信息为:
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
如果按RCFile存储,元信息为:
SerDe Library: org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe
InputFormat: org.apache.hadoop.hive.ql.io.RCFileInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.RCFileOutputFormat
文本文件是按行存储,RCFile是按列存储。对于只涉及记录中的少数列的查询,如果记录存放在文本文件中,则不太容易跳过各条记录中不需要的列;而如果记录存在于RCFile中,则可以为RCFileInputFormat设定参数,指定只读取需要的列。
原文:http://blog.csdn.net/wyc09/article/details/20036917