2017-03-08 26 views
1

如果我建立了一些S3(或HDFS)的顶部的蜂巢表目录中,像这样:能自动撵表更新时基本目录改变

创建外部表newtable的(名称字符串)的终止行格式分隔的字段','存储为文本文件位置's3a:// location/subdir /';

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

+0

是直接将文件添加到's3a:// location/subdir /'或该位置下的任何子目录吗? – franklinsijo

+0

这没有意义。 Metastore拥有的位置,而不是其内容。在查询表格时,位置内的每个文件都应该被扫描。 –

+0

@franklinsijo将文件添加到's3a:// location/subdir /'目录。 @Dudu每个文件应该被扫描,这就是为什么如果我添加另一个文件到该子目录,我希望数据显示时,我在表上运行'选择*'。但它不;它显示了相同的表格(没有新添加的数据)。 – covfefe

回答

1

在HDFS上,每次查询时,每个文件都被扫描为@Dudu Markovitz指出的。 HDFS中的文件立即保持一致。在S3文件创建后立即保持一致,并在删除或覆盖后最终保持一致。在s3表格文件夹中添加新文件时,在查询Hive表格时可立即访问它们。如果您正在重写文件,则S3中最终的一致性可能有问题。如果你重写文件,它们不是立即一致的,它们最终是一致的,请看这里:http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel。有几种方法可以消除最终的一致性问题,例如每次基于时间戳写入新创建的分区,或者基于时间戳或某个runID创建具有新位置的表。这个想法是每次创建新文件。 也看看这个:https://github.com/andrewgaul/are-we-consistent-yet

也有可能是使用添加文件后查询表时,统计数据的问题,在这里看到:https://stackoverflow.com/a/39914232/2700344

0

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