无法修复 Amazon Athena 中的分区

rob*_*ur1 3 hive amazon-web-services amazon-athena aws-glue

我最近一直在从事一个项目,该项目涉及使用 Glue 托管服务在 Amazon S3 中抓取数据。这成功地创建了一个 Metastore,我可以在 Glue 控制台上看到它。

我通过控制台手动解决了模式中的错误,例如 STRING --> TIMESTAMP、BIGINT --> STRING 等。一个分区似乎是从 S3 路径中的键自动创建的。即我在 s3 中的对象的键是这样的:

s3://mybucket/YYYMM/object.csv

Glue 通过密钥的 YYYMM(例如 201711)部分成功地对数据进行了分区。

当我运行查询时,我收到以下错误 HIVE_PARTITION_SCHEMA_MISMATCH 这表明虽然表架构已更新,但分区架构尚未更新

查看我发现的文档... https://docs.aws.amazon.com/athena/latest/ug/glue-best-practices.html#schema-syncing

具体来说

有几种方法可以解决此问题。首先,如果数据被意外添加,您可以删除导致架构差异的数据文件,删除分区,并重新抓取数据。其次,您可以删除单个分区,然后在 Athena 中运行 MSCK REPAIR 以使用表的架构重新创建分区。仅当您确信应用的架构将继续正确读取数据时,第二个选项才有效。

所以我尝试了第二个选项并运行。

ALTER TABLE mydb.mytable DROP PARTITION (partition_0=201711), PARTITION (partition_0=201712)
MSCK REPAIR TABLE mydb.mytable
Run Code Online (Sandbox Code Playgroud)

删除分区似乎是成功的,但运行修复表会产生

Partitions not in metastore: mytable:201711 mytable:201712

而且我无法取回任何数据。手动读取分区似乎也不起作用。

例如

ALTER TABLE mydb.mytable ADD
    PARTITION (partition_0=201711) LOCATION 's3://bucket/201711',
Run Code Online (Sandbox Code Playgroud)

给出错误 line 2:2: missing 'column' at 'partition' (service: amazonathena; status code: 400; error code: invalidrequestexception;

任何帮助,将不胜感激

rob*_*ur1 5

如果以后有人遇到这个问题,我在这个问题中找到了我的问题的答案。 /sf/answers/2372667461/

因此,将存储桶中密钥的格式从

s3://mybucket/YYYMM/object.csv 到:

s3://mybucket/date=YYYMM/object.csv

然后运行

ALTER TABLE mydb.mytable DROP PARTITION (partition_0=201711), PARTITION (partition_0=201712)
MSCK REPAIR TABLE mydb.mytable
Run Code Online (Sandbox Code Playgroud)

重新添加了我丢失的分区。