【问题标题】:Can Hive table automatically update when underlying directory is changed底层目录更改时 Hive 表可以自动更新吗
【发布时间】:2017-03-08 16:18:44
【问题描述】:

如果我在一些 S3(或 HDFS)目录之上构建 Hive 表,如下所示:

create external table newtable (name string) 
row format delimited 
fields terminated by ',' 
stored as textfile location 's3a://location/subdir/';

当我将文件添加到该 S3 位置时,Hive 表不会自动更新。仅当我在该位置创建新的 Hive 表时才包含新数据。有没有办法构建 Hive 表(可能使用分区),以便每当将新文件添加到底层目录时,Hive 表会自动显示该数据(无需重新创建 Hive 表)?

【问题讨论】:

  • 文件是直接添加到s3a://location/subdir/还是该位置下的任何子目录?
  • 这没有意义。 Metastore 保存位置,而不是其内容。当您查询表时,应该扫描该位置内的每个文件。
  • @franklinsijo 文件已添加到s3a://location/subdir/ 的目录中。 @Dudu 每个文件都应该被扫描,这就是为什么如果我向该子目录添加另一个文件,我希望当我在表上运行“select *”时显示该数据。但事实并非如此;它显示了同一张表(没有新添加的数据)。

标签: hadoop amazon-s3 hive hdfs


【解决方案1】:

在 HDFS 上,每个文件都扫描每个被查询的时间表,正如@Dudu Markovitz 指出的那样。并且 HDFS 中的文件立即保持一致。

更新: S3 is also strongly consistent now,因此删除了有关最终一致性的部分。

另外在添加文件后查询表时使用统计可能会出现问题,请看这里:https://stackoverflow.com/a/39914232/2700344

【讨论】:

    【解决方案2】:

    @leftjoin 所说的一切都是正确的,还有一个额外的细节:s3 不提供列表的即时一致性。可以上传新的 blob,HEAD/GET 将返回它,但父路径上的列表操作可能看不到它。这意味着列出目录的 Hive 代码可能看不到数据。使用唯一名称并不能解决此问题,只能使用像 Dynamo 这样的一致数据库,该数据库会随着文件的添加/删除而更新。即使在那里,你也添加了一个新的东西来保持同步......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多