默认情况下,Hive只将文件存储为纯文本文件,并将记录存储为纯文本,全部未压缩。它使用ASCII 0x1作为字段分隔符,对于某些输入,它比逗号更方便,但我相信你已经弄清楚了如何让Hive使用逗号分隔值。如果你希望Hive使用不同的文件格式,不同的序列化/反序列化,或者压缩数据,你有几个不同的选项可供玩耍。
Hive支持几种不同的文件格式:TEXTFILE
,SEQUENCEFILE
和RCFILE
。与文件读取,分割和写入方式之间的区别。 TEXTFILE
是默认设置,可以在普通文本文件上运行。 SEQUENCEFILE
是一个二进制的键值对格式,容易被Hadoop生态系统的其他部分使用。并且RCFILE
是一种列保存Hive表的方式。除了这种文件格式之外,你可以编写你自己的或者找到别人写的文件来满足不同的需求。
除了保存数据的文件格式之外,还可以通过指定SerDe来决定表中的记录应如何序列化和反序列化。 Hive 0.9.1及以上版本包含AvroSerDe
,Avro以二进制格式保存数据(它也有一个模式本身,它引入了一些复杂性)。谷歌搜索“配置单元SerDe”显示LazyBinarySerde
这听起来像是一种更直接的二进制格式保存方式。如果你找不到任何符合你需求的东西,你可以随时编写你自己的SerDe。
我想你的问题适合如何使Hive表更小和/或更高性能的大环境。为此,你可以在上面提到的所有东西上应用压缩。要做到这一点只需告诉蜂房压缩它的输出,并告诉它该编解码器使用下面的命令来压缩:
hive> set hive.exec.compress.output=true;
hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
,如果你希望这些设置在会议之外坚持您可以在配置文件更改此设置(包括其他如果您正在共享群集,则需要Hive和MapReduce人员)。我使用SnappyCodec,因为它可以与Hive一起使用,是可拆分的,并为CPU花费的CPU时间提供良好的压缩/解压缩。您可能会决定使用不同的编解码器更适合您的需求。
现在如果所有数据都是CSV格式,那么如何应用所有这些选项?最简单的方法是在CSV文件上创建一个表格,然后用你想要的fileformat和SerDe创建另一个表格,然后将支持CSV的表格中的数据插入到新表格中(确保你压缩了你的Hive输出与您的编解码器的选择)。在引擎盖下,Hive将负责从一种格式(CSV)读取数据并写入另一种格式(无论您决定如何)。在此之后,您将拥有数据副本,并且可以根据需要删除CSV文件。
CREATE EXTERNAL TABLE csv_table (id INT, name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
LOCATION /user/muehlbau/yourData;
CREATE TABLE binary_table (id INT, name STRING)
ROW FORMAT SERDE org.apache.hadoop.hive.serde2.lazybinary.LazyBinarySerDe
STORED AS SEQUENCEFILE;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
INSERT OVERWRITE TABLE binary_table
SELECT * FROM csv_table
上面的例子演示了如何能够充分利用所有提供给您的选项优势,但不要把它作为一个默认的,合理的使用情况。阅读不同的文件格式/ SerDes /压缩编解码器,并进行一些性能测试以解决您的方法。
感谢您的详细描述! – muehlbau 2013-05-08 11:30:02
伟大的答案! +1 – davek 2014-09-30 14:01:05