GCP将数据作为字符串从GCS中的CSV文件加载到BigQuery表中

Posted

技术标签:

【中文标题】GCP将数据作为字符串从GCS中的CSV文件加载到BigQuery表中【英文标题】:GCP Loading a Data as String into BigQuery table from a CSV file in GCS 【发布时间】:2021-06-27 10:12:47 【问题描述】:

Google Cloud Storage 中的 CSV 文件具有“dd/mm/yyyy”格式的日期值,当加载到 Bigquery 表中时,它的格式为“mm/dd/yyyy”。

为了解决这个问题,我创建了一个表,其中所述字段为“字符串”,当尝试从文件中加载数据时,它说:

Provided Schema does not match Table <table name>. Field TRADE_DATE has changed type from STRING to DATE

如何将日期作为字符串从 CSV 文件加载到 BigQuery 表中?

【问题讨论】:

【参考方案1】:

由于您事先创建了表并引用了〜日期值,BQ 不应该这样。

您的Load Job 是否还有--autodetect 配置?

【讨论】:

我正在从 SQL 工作区加载数据,并检查了架构自动检测。文件中的日期值本身没有被引用。这会是个问题吗? 老实说,我不确定现在是否需要报价。但首先;在没有Autodetect 的情况下试一试。由于表已经创建,您不需要推断模式。 @S.Nori 如果我取消选择自动检测,它会失败并显示以下错误消息:看起来您正在附加到启用了自动检测的现有表。禁用自动检测可能会解决此问题。【参考方案2】:

由于您的表已经有一个将日期列定义为字符串数据类型的架构,因此当您尝试从启用自动检测的 GCS 加载数据时,会出现架构不匹配的情况。自动检测架构将日期列读取为日期数据类型而不是字符串。如果您取消选中自动检测架构选项,则需要在加载数据时手动提供架构。

考虑使用以下步骤:-

从 GCS 存储桶中的 CSV 文件创建一个表,并通过取消选中自动检测架构选项来手动提供架构。 为日期列提供数据类型作为字符串。使用高级选项下拉菜单跳过标题行(如果有)。 将日期列“TDate”解析为正确的格式,在表上运行以下查询:-
SELECT Tid, parse_date("%d/%m/%Y", TDate) as TDate FROM `projectName.DatasetName.tableName`
我在格式字符串中使用了“/”作为分隔符,以匹配您提供的日期格式。您可以参考此document 了解更多支持的格式元素。 通过单击控制台上的“保存结果”按钮将上述查询的结果保存在不同的表中。您可以看到“TDate”列的数据类型是新表中的日期。如果您在将查询输出保存到表时需要帮助,可以参考此document。 您可以通过运行以下查询来验证 BigQuery 是否以您已解析的格式识别日期:-
SELECT EXTRACT(Day FROM TDate ) as Day, EXTRACT(MONTH FROM TDate ) as Month FROM `projectName.DatasetName.tableName`
您可以参考此document,详细了解 BigQuery 中的日期函数。

如果您可以选择更改 CSV 文件,那么您可以参考此BigQuery documentation。它提到,当您将数据从 CSV 文件加载到 BigQuery 时,“日期”列中的值必须使用“-”分隔符,并且日期必须采用以下格式:YYYY-MM-DD。

【讨论】:

以上是关于GCP将数据作为字符串从GCS中的CSV文件加载到BigQuery表中的主要内容,如果未能解决你的问题,请参考以下文章

将 CSV 从 GCS 批量加载到 BigQuery 时,表数据是增量查看还是仅在所有文件加载后才可查看?

无法将 csv 文件从 GCS 加载到 bigquery

从 GCS 获取海量 csv 文件到 BQ

大查询 csv 加载问题

GCP 云存储(GCS)新对象/更改通知到电子邮件/文本,消息

无法从数据流中的 GCS 读取我的配置文本文件(列名)