AWS Athena 中的文件系统上缺少表

Let*_*eta 8 sql hive amazon-athena

我在 Athena 上使用此代码创建了一个具有自动分区的表。

CREATE EXTERNAL TABLE IF NOT EXISTS matchdata.stattable (
  `matchResult` string,
  ...
) PARTITIONED BY (
  year int ,
  month int,
  day int
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
) LOCATION 's3://******/data/year=2019/month=8/day=2/'
TBLPROPERTIES ('has_encrypted_data'='false');
Run Code Online (Sandbox Code Playgroud)

我运行了MSCK REPAIR TABLE stattable,但文件系统上缺少表,并且查询结果返回零记录。matchdata.stattable 得到相同的结果。

另一个没有分区的表,查询工作正常。但随着服务的继续和数据集的增长,我必须进行分区。

示例数据路径为 data/2019/8/2/1SxFHaUeHfesLtPs._BjDk.gz。我该如何解决这个问题?

The*_*heo 6

正如您所发现的(但对于具有相同问题的人来说有更多上下文)MSCK REPAIR TABLE \xe2\x80\xa6只能理解 Hive 风格的分区,例如/data/year=2019/month=08/day=10/file.json. 该命令的真正作用是扫描 S3 上与表指令相对应的前缀LOCATION,并查找类似的路径组件。

\n\n

这只是 的限制MSCK REPAIR TABLE \xe2\x80\xa6,您可以手动添加具有其他路径样式的分区,如下所示:

\n\n
ALTER TABLE the_table ADD PARTITION (year = \'2019\', month = \'08\', day = \'10\') LOCATION \'s3://some-bucket/data/2019/08/10/\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

另请参阅https://docs.aws.amazon.com/athena/latest/ug/alter-table-add-partition.html

\n\n

我什至想说你应该MSCK REPAIR TABLE \xe2\x80\xa6完全避免使用。它很慢,并且分区越多只会变得更慢。当您在 S3 上添加新数据时,运行效率要高得多ALTER TABLE \xe2\x80\xa6\xc2\xa0ADD PARTITION \xe2\x80\xa6,因为您知道刚刚添加的内容及其位置,因此不需要告诉 Athena 扫描整个前缀。直接使用 Glue API 速度更快,但不幸的是,代码量更多。

\n


Let*_*eta 0

我通过重命名 s3 文件的前缀解决了这个问题。

您实际上无法直接在 s3 中重命名或移动文件。通过 mv 命令,您应该创建另一个密钥并删除现有的密钥。

通过在控制台上运行此代码,您可以使 Hive 能够了解分区的位置。

aws s3 --recursive mv s3://***/data/2019/8/7/ s3://***/data/year=2019/month=8/day=7/
Run Code Online (Sandbox Code Playgroud)