Hive动态分区生成多个文件

时间:2014-01-28 12:56:43

标签: amazon-s3 hive

我有一些Hive工作在一天内运行。这项工作是将数据输出到Amazon S3。 Hive作业使用动态分区。

问题在于,当不同的作业需要写入相同的动态分区时,它们每个都会生成一个文件。

我希望后续作业加载现有数据并将其与新数据合并。

我应该提到实际输出到S3的查询是INSERT INTO TABLE查询。

2 个答案:

答案 0 :(得分:1)

每次都不重写所有数据,这在Hadoop 1.x中肯定是不可能的,而且在2.0中会非常困难。

从根本上说,hadoop 1.x不支持文件追加。如果出现新进程并想要写入目录,则必须创建新文件;它不可能附加到现有的那些上。

即使有可能追加(如2.0),也会有许多竞争条件和其他让蜂巢担心的事情。这是一个非常困难的问题。

然而,这是一个常见问题。典型的解决方案是让您的进程添加新文件,并定期运行“压缩”作业,该作业只需执行以下操作:

insert overwrite table my_table partition (foo='bar')
select * from my_table where foo = 'bar'
distribute by foo;

这应该只强制创建一个文件。但是,你应该再担心竞争条件。要么确保已启用锁定,要么只确保您确定没有写入的紧凑分区。

答案 1 :(得分:0)

我想你可以尝试INSERT OVERWRITE TABLE