如果我在某个S3(或HDFS)目录之上构建一个Hive表,如下所示:
创建外部表newtable(名称字符串)行格式以','结尾的分隔字段存储为文本文件位置's3a:// location / subdir /';
当我将文件添加到该S3位置时,Hive表不会自动更新。仅当我在该位置创建新的Hive表时才会包含新数据。有没有办法构建一个Hive表(可能使用分区),这样每当新文件添加到底层目录时,Hive表会自动显示该数据(无需重新创建Hive表)?
答案 0 :(得分: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
答案 1 :(得分:0)
@leftjoin所说的一切都是正确的,还有一个额外的细节:s3并没有提供列表的即时一致性。可以上传新的blob,HEAD / GET将返回它,但父路径上的列表操作可能看不到它。这意味着列出目录的Hive代码可能看不到数据。使用唯一名称并不能解决这个问题,只能使用像Dynamo这样的一致数据库,它会在添加/删除文件时更新。即使在那里,你也添加了一个新的东西来保持同步......