AWS Athena移除SkewedInfo后新旧分区location列显示异常求助
问题分析:Athena中EXTERNAL_TABLE分区数据显示差异原因
问题背景
我有一个名为logging的EXTERNAL_TABLE,表属性如下:
{ "Name": "logging", "DatabaseName": "logging_data", "Description": "", "Owner": "allan", "CreateTime": "2024-03-22T16:10:24.000Z", "UpdateTime": "2025-02-16T08:54:25.000Z", "Retention": 0, "StorageDescriptor": { "Columns": [ { "Name": "id", "Type": "string", "Comment": "" }, { "Name": "logname", "Type": "string", "Comment": "" }, { "Name": "location", "Type": "string", "Comment": "" } ], "Location": "s3://logging-data-993562011282-us-east-1-dev/logdata/logging", "InputFormat": "org.apache.hadoop.mapred.TextInputFormat", "OutputFormat": "http://org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", "Compressed": false, "NumberOfBuckets": 0, "SerdeInfo": { "SerializationLibrary": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe", "Parameters": { "serialization.format": "\t", "field.delim": "\t" } }, "SortColumns": [], "Parameters": {}, "SkewedInfo": { "SkewedColumnNames": [], "SkewedColumnValues": [], "SkewedColumnValueLocationMaps": {} }, "StoredAsSubDirectories": false }, "PartitionKeys": [ { "Name": "timestamp", "Type": "string", "Comment": "" } ], "TableType": "EXTERNAL_TABLE", "CreatedBy": "arn:aws:sts::993562011282:assumed-role/Logging-data-admin/ConduitAccountService+Dev+Default+NA+Fleet+P-allan", "IsRegisteredWithLakeFormation": false, "CatalogId": "993562011282", "IsRowFilteringEnabled": false, "VersionId": "13", "CatalogIdentifier": "993562011282", "DatabaseId": "1mndnsasdcdbcf692c422y2732jndjbdhfd32323jnj2", "IsMultiDialectView": false }
旧分区路径s3://logging-data-993562011282-us-east-1-dev/logdata/logging/timestamp=20250216001下的数据:
123456 cloud \N
在Athena查询时,location列显示为N。
移除表属性中的SkewedInfo后,新分区放入数据:
123456 cloud
查询时新分区的location列显示为空,但旧分区仍显示N。
原因分析
1. 旧分区location显示N的原因
该表使用LazySimpleSerDe序列化器,默认情况下,若未配置serialization.null.format参数指定NULL标识,当表存在SkewedInfo属性(即使为空)时,SerDe会跳过NULL值的特殊解析逻辑,直接将\N当作普通字符串处理,最终显示为"N"。
2. 移除SkewedInfo后新、旧分区显示差异的原因
- 新分区显示为空:移除
SkewedInfo后,LazySimpleSerDe触发默认的NULL解析规则——自动将\N映射为NULL值。而新分区数据中location列对应的位置是空白(无\N),SerDe会将其解析为空字符串/NULL,因此显示为空。 - 旧分区仍显示
N:Athena的分区元数据独立存储,表级属性修改不会自动同步到已存在的分区。旧分区的元数据仍保留原有的SkewedInfo相关处理逻辑,所以依旧按照旧规则解析\N为字符串"N"。
验证与解决建议
- 若要让旧分区也显示NULL,需手动刷新旧分区元数据,或删除旧分区后重新加载。
- 若希望统一NULL值处理逻辑,建议在表的
SerdeInfo.Parameters中显式添加"serialization.null.format": "\\N",无论SkewedInfo是否存在,SerDe都会将\N解析为NULL值。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

