You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:31:04