蜂巢:如果我手动将数据文件复制到表的位置文件夹中会发生什么?

时间:2018-12-25 07:02:05

标签: hive hdfs load

我尝试将数据文件复制到表的位置文件夹中(而不是使用load命令),并且在某种意义上说我可以查询新数据。但是,我看到的所有源都将始终使用load命令来执行此操作。他们从不谈论直接将数据文件复制到位置文件夹的问题。我觉得直接将文件复制到位置文件夹不是一个好主意,但是我看不到任何关于为什么这是个坏主意的解释。

有人知道为什么不应该将数据文件直接复制到表的位置文件夹吗?

3 个答案:

答案 0 :(得分:2)

对此的答案取决于该表是否为Hive托管表与外部表。

通常,外部表不会存储或分区,即它们是由某些外部进程管理的。在这种情况下,只要您具有数据控制机制,就可以将文件放在那里。

Hive托管表是一个不同的故事。 Hive通过将文件分为文件夹(和子文件夹)来管理分区。通过将密钥散列到不同文件中来管理存储桶。在这种情况下,如果将文件自己放入这些文件夹中,则可能会导致无法预料的结果或错误。

对于需要压缩的事务表(直到需要Hive 2.0进行存储),情况变得更加复杂

答案 1 :(得分:1)

您可以将数据直接复制到表位置,并将其反映到查询中。但是,如果表是分区表,并且文件包含多个分区的数据,那么仅复制文件将无济于事,在这种情况下,您必须使用load命令加载数据。

如果文件包含单个分区的数据,则可以将该文件复制到该特定分区并对该表进行msck修复,这将更新表的元数据,结果将反映到您的查询中。

答案 2 :(得分:1)

在Hive早期版本3.0中,加载操作是纯复制/移动操作,可将数据文件移动到与Hive表/分区相对应的位置。

Hive 3.0及更高版本支持其他加载操作,因为Hive在内部将加载重写为INSERT AS SELECT。从Hive 3.0开始,LOAD命令还要注意分区和存储桶。

有关更多详细信息,请参见文档:Loading Files into tables