无法修复 Amazon Athena 中的分区



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

我通过控制台手动解决的模式中存在错误,例如字符串 --> 时间戳、BIGINT --> 字符串等。 分区似乎是从 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

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

Partitions not in metastore: mytable:201711 mytable:201712

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

例如

ALTER TABLE mydb.mytable ADD
PARTITION (partition_0=201711) LOCATION 's3://bucket/201711',

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

任何帮助将不胜感激

万一以后有人遇到这个问题,我在这个问题上找到了我问题的答案。 https://stackoverflow.com/a/33895249/4537686

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

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

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

最新更新