BigQuery通过外部表读取GCS含0001-01-01日期的Parquet数据报错求助
解决办法
1. 手动指定外部表Schema,将日期列设为STRING类型
创建外部表时,跳过BigQuery的自动Schema推断,手动定义列类型,把SETUP_DATE设为STRING,避免触发日期解析错误:
CREATE OR REPLACE EXTERNAL TABLE `dataset1.table1` ( SETUP_DATE STRING, -- 按实际数据添加其他列定义,例如: XTRTS_DATE DATE, COLUMN1 INT64, COLUMN2 STRING ) OPTIONS ( format = 'PARQUET', uris = ['gs://bucket01/landing/OBS/table1/XTRTS_DATE=2024-05-24/*.parquet'] );
查询时可通过SAFE.PARSE_DATE转换日期,同时处理0001-01-01这类特殊值:
SELECT CASE WHEN SETUP_DATE = '0001-01-01' THEN NULL -- 可替换为业务需要的默认日期 ELSE SAFE.PARSE_DATE('%Y-%m-%d', SETUP_DATE) END AS SETUP_DATE, -- 其他列 FROM `dataset1.table1`;
2. 直接查询GCS文件时指定列类型
若无需持久化外部表,可通过临时表读取GCS文件并手动指定Schema:
CREATE TEMP TABLE temp_table ( SETUP_DATE STRING, -- 其他列定义 ) OPTIONS ( format = 'PARQUET', uris = ['gs://bucket01/landing/OBS/table1/XTRTS_DATE=2024-05-24/*.parquet'] ); SELECT SAFE.PARSE_DATE('%Y-%m-%d', SETUP_DATE) AS SETUP_DATE, -- 其他列 FROM temp_table;
3. 将日期列解析为INT32类型(匹配Parquet原始存储)
Parquet的DATE类型实际存储为1970-01-01的天数偏移量(负数代表更早日期),可将SETUP_DATE定义为INT32,再转换为DATE:
CREATE OR REPLACE EXTERNAL TABLE `dataset1.table1` ( SETUP_DATE INT32, -- 其他列定义 ) OPTIONS ( format = 'PARQUET', uris = ['gs://bucket01/landing/OBS/table1/XTRTS_DATE=2024-05-24/*.parquet'] ); SELECT DATE_ADD(DATE '1970-01-01', INTERVAL SETUP_DATE DAY) AS SETUP_DATE, -- 其他列 FROM `dataset1.table1`;
这种方式能精准还原原始日期,包括0001-01-01。
内容的提问来源于stack exchange,提问作者JU ZHU SUN
相关产品推荐
相关产品推荐

