我在hive中创建外部表,然后用户insert overwrite directory ...
添加文件。但是,第二次运行我的查询时,我希望旧文件被删除,新文件会替换它们(因为我有覆盖选项)。然而情况并非如此,并且新文件被添加到目录中而不删除导致数据不一致的旧文件。这里出了什么问题?
答案 0 :(得分:1)
我打算提交一个错误,但这是现有问题:HIVE-13997 - 如果您希望将overwrite directory
用于预期结果,请应用补丁。
从测试中我发现的是:
overwrite directory
和overwrite 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