有没有办法将CSV数据加载到“二进制”Hive格式?

时间:2013-05-06 15:59:42

标签: hive

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

在相关的说明中:我怀疑Hive确实在查询处理期间将字符串值转换为机器表示,而不是,例如,比较字符串值 - 这个假设是正确的吗?

1 个答案:

答案 0 :(得分:23)

默认情况下,Hive只将文件存储为纯文本文件,并将记录存储为纯文本,所有文件都是未压缩的。它确实使用ASCII 0x1作为字段分隔符,这对于某些输入比逗号更方便,但我确定你已经弄清楚如何让Hive使用逗号分隔值。如果您希望Hive使用不同的文件格式,不同地序列化/反序列化,或压缩数据,您可以使用几种不同的选项。

开箱即用,Hive支持多种不同的文件格式:TEXTFILESEQUENCEFILERCFILE。它们之间的区别与文件的读取,拆分和写入方式有关。 TEXTFILE是默认值,可以在普通文本文件上运行。 SEQUENCEFILE是一种二进制键值对格式,很容易被Hadoop生态系统的其他部分使用。 RCFILE是一种以列为导向的方法来保存Hive表。除了这些文件格式之外,您还可以编写自己的文件格式或查找其他人编写的文件格式以满足不同的需求。

除了保存数据的文件格式之外,您还可以通过指定SerDe来决定如何对表中的记录进行序列化和反序列化。 Hive 0.9.1及更高版本包含一个AvroSerDe,Avro以二进制格式保存数据(它还有一个模式本身,它引入了一些复杂性)。谷歌搜索“hive二进制文件SerDe”显示LazyBinarySerde,这听起来像是一种更简单的二进制格式保存方式。如果您找不到符合您需求的任何东西,您可以随时编写自己的SerDe。

我认为你的问题适合于如何使Hive表更小和/或更高性能的大背景。为此,您可以在我上面提到的所有内容之上应用压缩。要实现这一点,只需告诉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花费的时间提供良好的压缩/解压缩。您可能会认为不同的编解码器更适合您的需求。

现在,如果您的所有数据都是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 /压缩编解码器,并进行一些性能测试以确定您的方法。