在hive中插入覆盖不能正常工作

时间:2016-07-25 23:07:00

标签: hive hiveql

我在hive中创建外部表,然后用户insert overwrite directory ...添加文件。但是,第二次运行我的查询时,我希望旧文件被删除,新文件会替换它们(因为我有覆盖选项)。然而情况并非如此,并且新文件被添加到目录中而不删除导致数据不一致的旧文件。这里出了什么问题?

1 个答案:

答案 0 :(得分:1)

我打算提交一个错误,但这是现有问题:HIVE-13997 - 如果您希望将overwrite directory用于预期结果,请应用补丁。

从测试中我发现的是:

overwrite directoryoverwrite table的工作方式不同:如果您希望覆盖整个目录,则应使用overwrite table

创建此表进行测试:create external table t2 (a1 int,a2 string) LOCATION '/user/cloudera/t2';

<强> overwrite directory:

正如您所料,目录是OVERWRITten;换句话说,如果指定的路径存在,则它被破坏并用输出替换。

hive> insert overwrite directory '/user/cloudera/t2' select * from sqoop_import.departments;

因此,如果上述语句要在位置/user/cloudera/t2/000000_0写入数据,则只覆盖此位置。

#~~~~ BEFORE ~~~~
[cloudera@quickstart ~]$ hadoop fs -ls /user/cloudera/t2/*
-rwxr-xr-x   1 cloudera cloudera         60 2016-07-25 17:42 /user/cloudera/t2/000000_0
-rwxr-xr-x   1 cloudera cloudera          0 2016-07-25 15:48 /user/cloudera/t2/_SUCCESS
-rwxr-xr-x   1 cloudera cloudera         88 2016-07-25 15:48 /user/cloudera/t2/part-m-00000
-rwxr-xr-x   1 cloudera cloudera         60 2016-07-25 15:48 /user/cloudera/t2/part-m-00001

#~~~~ AFTER: Note the timestamp ~~~~
[cloudera@quickstart ~]$ hadoop fs -ls /user/cloudera/t2/*
-rwxr-xr-x   1 cloudera cloudera         60 2016-07-25 18:01 /user/cloudera/t2/000000_0
-rwxr-xr-x   1 cloudera cloudera          0 2016-07-25 15:48 /user/cloudera/t2/_SUCCESS
-rwxr-xr-x   1 cloudera cloudera         88 2016-07-25 15:48 /user/cloudera/t2/part-m-00000
-rwxr-xr-x   1 cloudera cloudera         60 2016-07-25 15:48 /user/cloudera/t2/part-m-00001

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~

overwrite table:

所选表或分区的内容将替换为相应select语句的输出。

hive> insert overwrite table t2 select * from sqoop_import.departments;

现在整个目录都被覆盖了:

[cloudera@quickstart ~]$ hadoop fs -ls /user/cloudera/t2/*
-rwxr-xr-x   1 cloudera cloudera         60 2016-07-25 18:03 /user/cloudera/t2/000000_0
-rwxr-xr-x   1 cloudera cloudera          0 2016-07-25 15:48 /user/cloudera/t2/_SUCCESS

所以总之,覆盖目录只覆盖生成文件的直接路径而不是目录。 see Writing-data-into-the-file-system-from-queries