我收到一个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>
答案 0 :(得分:1)
我建议您停止使用Glue搜寻器。这可能不是您所希望的响应,但是爬虫确实很糟糕。有时它们可能是有用的一种方法,它是从别人产生的随机数据堆中获取模式的一种方式,您不想花时间去研究它的模式是什么-但是一旦有了模式,并且您知道新数据将遵循该模式,而Glue搜寻器只是这样,并且会产生不必要的问题,例如您遇到的问题。
该怎么做取决于新数据如何添加到S3。
如果您控制产生数据的代码,则可以添加在上载数据后添加分区的代码。此解决方案的好处是,在产生新数据后立即添加分区,因此表始终是最新的。但是,它可能会以一种不希望的方式将数据生成代码与Glue(如果希望通过SQL添加分区,则将Athena紧密结合)。
如果从产生数据的代码中添加分区没有意义,则可以创建一个执行该操作的Lambda函数。您可以将其设置为每天固定时间运行(如果您知道新数据的位置,则不必等到它存在时,分区可以指向空位置),也可以通过S3通知触发它(如果有多个文件,您可以找到一种方法来通过SQS消除通知的反跳,也可以一次又一次创建分区,如果分区已经存在,则只需吞下错误即可。)
您可能还听说过MSCK REPAIR TABLE …
。在某些方面,它比Glue搜寻器好,但在其他方面,它也同样糟糕。它只会添加新的分区,而永远不会更改架构,这通常是您想要的,但是效率极低,并且运行速度越慢,文件越多越慢。有点像胶履带。