使用Athena迁移Glue表至Iceberg时遇类型不匹配问题求助
问题分析与解决
为什么会出现varchar类型?
Glue爬虫在元数据里标记字段为string,但当你用Athena或Presto这类查询引擎读取Glue表时,引擎会将JSON中的字符串隐式解析为varchar类型(JSON没有固定长度字符串的概念,引擎用varchar做兼容处理)。而你手动创建的Iceberg表定义的是string,两者类型校验不匹配,导致插入失败。
解决办法
1. 插入时显式转换字段类型
在SELECT语句中把查询到的varchar类型强制转为string,匹配Iceberg表的定义:
INSERT INTO "icebergtest" SELECT CAST(name AS string), CAST(address AS string), customer, CAST(features AS array(struct<featurename:string,featureId:string,featureAge:double,featureVersion:string>)) FROM "customer_json_table";
2. 对齐Iceberg表的类型定义
直接用varchar替代string创建Iceberg表,和查询引擎解析后的类型保持一致:
CREATE TABLE icebergtest ( `name` varchar, `address` varchar, `customer` boolean, `features` array<struct<featurename:varchar,featureId:varchar,featureAge:double,featureVersion:varchar>> ) LOCATION 's3://<s3-bucket-name>/<blablapath>/' TBLPROPERTIES ( 'table_type' ='ICEBERG' );
(注意去掉原语句中最后一个字段后的逗号,避免语法错误)
3. 用Glue自动生成Iceberg表,避免手动定义偏差
利用Glue的表转换功能,直接将已有的Glue JSON表转换为Iceberg格式,这样元数据类型会自动对齐,无需手动编写建表语句。
内容的提问来源于stack exchange,提问作者Khan
相关产品推荐
相关产品推荐

