Azure Synapse从Parquet创建外部表时日期时间列报错求助
Azure Synapse外部表Parquet日期时间类型兼容问题
问题场景
在Azure Synapse中基于Azure Data Lake Storage的Parquet文件创建外部表时,处理registration_time(时间戳)和birthday(日期)列时持续报错。尝试将这两列定义为varchar类型、直接使用date/datetime类型均失败。
已尝试的建表代码
create external table [parquet_userdata] ( registration_time [varchar] (100) null, id [varchar] (10) null, first_name [varchar] (100) null, last_name [varchar] (100) null, email [varchar] (100) null, gender [varchar] (100) null, ip_address [varchar] (100) null, cc [varchar] (100) null, country [varchar] (100) null, birthday [varchar] (100) null, salary [float] null, title [varchar] (100) null, comments [varchar] (2000) null ) with( -- specify the file in container location= 'userdata.parquet', data_source = parquet_location, file_format = parquetformat )
报错信息
无法将Parquet类型TIMESTAMP_MILLIS转换为目标列类型VARCHAR(100);同时无法将Parquet类型DATE转换为目标列类型VARCHAR(100)。
数据背景
使用的Parquet文件为Teradata Kylo的示例数据,其中registration_time字段为毫秒级时间戳类型,birthday字段为日期类型。
解决方案
1. 匹配Parquet原始类型与Synapse兼容类型
Parquet的TIMESTAMP_MILLIS对应Synapse的datetime2(3)(保留毫秒精度),DATE对应Synapse的date类型。修改建表语句如下:
create external table [parquet_userdata] ( registration_time datetime2(3) null, id int null, first_name varchar(100) null, last_name varchar(100) null, email varchar(100) null, gender varchar(100) null, ip_address varchar(100) null, cc varchar(100) null, country varchar(100) null, birthday date null, salary float null, title varchar(100) null, comments varchar(2000) null ) with( location= 'userdata.parquet', data_source = parquet_location, file_format = parquetformat )
注:id字段在Parquet中为整型,建议同步改为int类型以匹配原始数据
2. 确认外部文件格式配置
确保parquetformat的定义正确,未强制错误的类型转换:
CREATE EXTERNAL FILE FORMAT parquetformat WITH ( FORMAT_TYPE = PARQUET, DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec' );
3. 先用OPENROWSET验证数据类型
若仍有问题,可先通过OPENROWSET直接查询Parquet文件,确认字段实际类型:
SELECT * FROM OPENROWSET( BULK 'userdata.parquet', DATA_SOURCE = 'parquet_location', FORMAT = 'PARQUET' ) AS [result]
根据查询结果的字段类型调整外部表的列定义。
内容的提问来源于stack exchange,提问作者Aku
相关产品推荐
相关产品推荐

