Mat*_*ake 2 amazon-web-services amazon-athena aws-glue
我收到一个HIVE_PARTITION_SCHEMA_MISMATCH错误,我不太确定该怎么办。当我查看 2 个不同的模式时,唯一不同的是我的一个结构中的键顺序(由胶水爬虫创建)。我真的不关心数据的顺序,我以 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>
Run Code Online (Sandbox Code Playgroud)
我建议您停止使用 Glue 爬虫。这可能不是您所希望的响应,但爬虫的工作真的很糟糕。它们有时可以用作从其他人生成的随机数据堆中获取模式的方法,并且您不想花时间查看其模式是什么——但是一旦你有了模式,并且您知道新数据将遵循该模式,而 Glue 爬虫只是挡道,并会产生不必要的问题,例如您遇到的问题。
要做什么取决于如何将新数据添加到 S3。
如果您可以控制生成数据的代码,则可以添加在数据上传后添加分区的代码。此解决方案的好处是在产生新数据后立即添加分区,因此表始终是最新的。但是,它可能会以一种不理想的方式将数据生成代码与 Glue(或 Athena,如果您更喜欢通过 SQL 添加分区)紧密耦合。
如果从生成数据的代码中添加分区没有意义,您可以创建一个执行此操作的 Lambda 函数。您可以将其设置为每天固定时间运行(如果您知道新数据的位置,则不必等到它存在,分区可以指向空位置),或者您可以通过 S3 通知触发它(如果有多个文件,您可以找出一种通过 SQS 消除通知的方法,或者只是一遍又一遍地创建分区,如果分区已经存在,只需吞下错误)。
您可能也听说过MSCK REPAIR TABLE …. 它在某些方面比 Glue 爬虫好,但在其他方面同样糟糕。它只会添加新分区,永远不会更改架构,这通常是您想要的,但效率极低,并且文件越多运行越慢。有点像胶水爬虫。
| 归档时间: |
|
| 查看次数: |
1588 次 |
| 最近记录: |