我有一些Hive工作在一天内运行。这项工作是将数据输出到Amazon S3。 Hive作业使用动态分区。
问题在于,当不同的作业需要写入相同的动态分区时,它们每个都会生成一个文件。
我希望后续作业加载现有数据并将其与新数据合并。
我应该提到实际输出到S3的查询是INSERT INTO TABLE
查询。
答案 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