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 时,表数据是增量查看还是仅在所有文件加载后才可查看?