S3 Inventory与Athena查询问题:类型不兼容及异常值
搞定S3 Inventory表查询的两个问题
嘿,看起来你遇到了S3 Inventory和Hive表之间典型的 schema 不匹配问题,这俩错误其实是同一个根源导致的,咱们一步步来解决:
问题本质分析
你的两个问题核心都是表结构定义和S3 Inventory输出的ORC格式不兼容:
- 那个离谱的
size数值(4923069104295859283)是类型解析错误的产物——当Hive试图把不匹配的类型硬转成bigint时,就会出现这种乱码值; HIVE_BAD_DATA错误直接点明了:ORC文件里的size是LONG类型,但你的表schema里定义的却是varchar(虽然你贴的CREATE语句里写的是bigint,但要么是实际表元数据没更新,要么是输入格式配置错了)。
具体修复步骤
1. 最稳妥的方式:重建正确的外部表
你当前表用的SymlinkTextInputFormat是用来读文本符号链接的,根本不适合S3 Inventory的ORC输出。直接重建一个适配ORC格式的表:
CREATE EXTERNAL TABLE s3_inventory_table( `bucket` string, `key` string, `version_id` string, `is_latest` boolean, `is_delete_marker` boolean, `size` bigint, `last_modified_date` timestamp, `e_tag` string, `storage_class` string ) PARTITIONED BY (dt string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS ORC LOCATION 's3://你的清单输出存储路径/' TBLPROPERTIES ( 'transient_lastDdlTime'='1516093603', 'orc.compress'='SNAPPY' -- 这个可选,和S3 Inventory的压缩格式对应上就行 );
2. 不想重建?修改现有表的配置
如果不想重新建表,那就直接修改现有表的输入输出格式和SerDe:
-- 修改文件格式为ORC ALTER TABLE `table` SET FILEFORMAT ORC; -- 切换到ORC专用的SerDe ALTER TABLE `table` SET SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'; -- 更新输入输出格式为ORC专用 ALTER TABLE `table` SET INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'; ALTER TABLE `table` SET OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat';
然后修复分区元数据,让Hive识别所有分区:
MSCK REPAIR TABLE `table`;
3. 确保字段类型完全匹配
S3 Inventory的ORC格式里,size本身就是bigint(对应Hive的LONG)类型,所以表中定义size bigint是对的。如果之前你误把size设成了varchar,得改回来:
ALTER TABLE `table` CHANGE COLUMN size size bigint;
验证修复结果
先跑个小查询看看size是否正常:
SELECT key, size FROM `table` LIMIT 10;
如果数值正常,再执行全表查询确认没有错误就搞定了!
内容的提问来源于stack exchange,提问作者duzvik
相关产品推荐
相关产品推荐

