如何忽略亚马逊雅典娜结构顺序

How to ignore amazon athena struct order

我收到一个 HIVE_PARTITION_SCHEMA_MISMATCH 错误,我不太确定该怎么做。当我查看这两种不同的模式时,唯一不同的是我的一个结构(由胶水爬虫创建)中键的顺序。我真的不关心数据的顺序,我接收的数据是 JSON blob,所以我不能保证键的顺序。

struct<device_id:string,user_id:string,payload:array<struct<channel:string,sensor_id:string,type:string,unit:string,value:double,name:string>>,topic:string,channel:string,client_id:string,hardware_id:string,timestamp:bigint,application_id:string>
struct<device_id:string,user_id:string,payload:array<struct<channel:string,name:string,sensor_id:string,type:string,unit:string,value:double>>,topic:string,channel:string,client_id:string,hardware_id:string,timestamp:bigint,application_id:string>

我建议您停止使用 Glue 爬虫。这可能不是您所希望的响应,但爬虫的工作确实很糟糕。它们有时可以用作从其他人生成的随机数据堆中获取架构的一种方式,并且您不想花时间查看它的架构是什么 - 但是一旦您有了架构,并且您知道新数据将遵循该模式,Glue 爬虫只是挡路,并产生不必要的问题,就像您遇到的那样。

取而代之的是如何将新数据添加到 S3。

如果您可以控制生成数据的代码,则可以添加在数据上传后添加分区的代码。此解决方案的好处是在生成新数据后立即添加分区,因此表始终是最新的。但是,它可能会以一种不可取的方式将数据生成代码与 Glue(或者 Athena,如果您更喜欢通过 SQL 添加分区)紧密耦合。

如果从生成数据的代码中添加分区没有意义,您可以创建一个执行此操作的 Lambda 函数。您可以在每天的固定时间将其设置为 运行(如果您知道新数据的位置,则不必等到它存在,分区可以指向空位置),或者您可以触发它通过 S3 通知(如果有多个文件,你可以想出一种方法来通过 SQS 消除通知或只是一遍又一遍地创建分区,如果分区已经存在,只需吞下错误)。

您可能也听说过MSCK REPAIR TABLE …。它在某些方面优于 Glue 爬虫,但在其他方面同样糟糕。它只会添加新分区,永远不会更改架构,这通常是您想要的,但效率极低,而且 运行s 文件越多越慢。有点像 Glue 爬虫。