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;
任何帮助,将不胜感激
如果以后有人遇到这个问题,我在这个问题中找到了我的问题的答案。 /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)
重新添加了我丢失的分区。