2013-05-06 74 views
11

我想知道是否有任何方法可以将CSV数据实际加载到二进制Hive格式中 - 即与数据在关系数据库中加载时一样:解析和类型转换输入并以二进制格式存储它(在Hive的情况下另一个二进制文件)。 Hive参考指出,load data inpath命令不会执行“任何转换”,因此我怀疑类型未转换,例如从字符串转换为整数。我正在阅读有关OCR和RCFile格式的内容,但我无法确定例如CSV中的字符串值是否被类型转换为机器整数值并存储在HDFS中。是这样吗?还有什么其他可能性可以在Hive中创建CSV文件的二进制表示?有没有办法将CSV数据加载到“二进制”Hive格式?

在相关说明:我怀疑Hive确实在查询处理期间将字符串值转换为机器表示形式,而不是(例如)比较字符串值 - 此假设是否正确?

回答

21

默认情况下,Hive只将文件存储为纯文本文件,并将记录存储为纯文本,全部未压缩。它使用ASCII 0x1作为字段分隔符,对于某些输入,它比逗号更方便,但我相信你已经弄清楚了如何让Hive使用逗号分隔值。如果你希望Hive使用不同的文件格式,不同的序列化/反序列化,或者压缩数据,你有几个不同的选项可供玩耍。

Hive支持几种不同的文件格式:TEXTFILE,SEQUENCEFILERCFILE。与文件读取,分割和写入方式之间的区别。 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 /压缩编解码器,并进行一些性能测试以解决您的方法。

+0

感谢您的详细描述! – muehlbau 2013-05-08 11:30:02

+0

伟大的答案! +1 – davek 2014-09-30 14:01:05

相关问题