我最近一直在做一个项目,该项目涉及使用 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
重新添加了我丢失的分区。