AWS Glue - 将字段添加到结构字段
AWS Glue - Adding fileld to a struct field
我在 AWS Glue 中定义了一个 table。我使用 AWS Kinesis 流使用此 table 定义将日志流式传输到 S3,使用镶木地板文件格式。它按日期分区。
table 中的一个字段是一个包含多个字段的结构,event_payload
,其中一个是结构数组。最近我在日志数据的内部结构中添加了一个新字段。我想将它添加到 table 定义中,以便将其写入 S3,以便我可以使用 AWS Athena 查询它。
我尝试直接在控制台中编辑 table 架构。它确实将数据写入 S3,但我在 Athena 中查询时出现异常:
HIVE_PARTITION_SCHEMA_MISMATCH: There is a mismatch between the table and partition schemas. The types are incompatible and cannot be coerced. The column 'event_payload' in table 'c2s.logs' is declared as type 'struct<...>', but partition 'year=2019/month=201910/day=20191026/hour=2019102623' declared column 'event_payload' as type 'struct<...>'.
我尝试按照指定 here 删除所有分区并修复 table,但出现另一个错误:
HIVE_CANNOT_OPEN_SPLIT: Error opening Hive split s3://.../year=2019/month=201910/day=20191022/hour=2019102216/beaconFirehose-4-2019-10-22-16-34-21-71f183d2-207e-4ae9-98fe-07dda0bab70c.parquet (offset=0, length=801679): Schema mismatch, metastore schema for row column event_payload.markings.element has 8 fields but parquet schema has 7 fields
所以架构有一个数据中不存在的字段。
有没有办法指定可选字段?如果它不存在,则将其设为空。
根据 link Athena 不支持嵌套结构的架构更新。完成这项工作的一种方法是在 Glue 中的 relaaionalize 运算符的帮助下展平结构类型。例如:
val frames: Seq[DynamicFrame] = lHistory.relationalize(rootTableName = "hist_root", stagingPath = redshiftTmpDir, JsonOptions.empty)
我在 AWS Glue 中定义了一个 table。我使用 AWS Kinesis 流使用此 table 定义将日志流式传输到 S3,使用镶木地板文件格式。它按日期分区。
table 中的一个字段是一个包含多个字段的结构,event_payload
,其中一个是结构数组。最近我在日志数据的内部结构中添加了一个新字段。我想将它添加到 table 定义中,以便将其写入 S3,以便我可以使用 AWS Athena 查询它。
我尝试直接在控制台中编辑 table 架构。它确实将数据写入 S3,但我在 Athena 中查询时出现异常:
HIVE_PARTITION_SCHEMA_MISMATCH: There is a mismatch between the table and partition schemas. The types are incompatible and cannot be coerced. The column 'event_payload' in table 'c2s.logs' is declared as type 'struct<...>', but partition 'year=2019/month=201910/day=20191026/hour=2019102623' declared column 'event_payload' as type 'struct<...>'.
我尝试按照指定 here 删除所有分区并修复 table,但出现另一个错误:
HIVE_CANNOT_OPEN_SPLIT: Error opening Hive split s3://.../year=2019/month=201910/day=20191022/hour=2019102216/beaconFirehose-4-2019-10-22-16-34-21-71f183d2-207e-4ae9-98fe-07dda0bab70c.parquet (offset=0, length=801679): Schema mismatch, metastore schema for row column event_payload.markings.element has 8 fields but parquet schema has 7 fields
所以架构有一个数据中不存在的字段。 有没有办法指定可选字段?如果它不存在,则将其设为空。
根据 link Athena 不支持嵌套结构的架构更新。完成这项工作的一种方法是在 Glue 中的 relaaionalize 运算符的帮助下展平结构类型。例如:
val frames: Seq[DynamicFrame] = lHistory.relationalize(rootTableName = "hist_root", stagingPath = redshiftTmpDir, JsonOptions.empty)