需要帮助创建将 CSV 加载到 BigQuery 的架构

Posted

技术标签:

【中文标题】需要帮助创建将 CSV 加载到 BigQuery 的架构【英文标题】:Need help creating schema for loading CSV into BigQuery 【发布时间】:2019-01-22 16:02:01 【问题描述】:

我正在尝试将一些 CSV 文件从 Google Cloud Storage 加载到 BigQuery 中,并尝试生成架构。有一个自动生成选项,但记录不充分。问题是,如果我选择让 BigQuery 生成架构,它在猜测数据类型方面做得不错,但有时它会将数据的第一行识别为标题行,有时它不会(将第一行视为行作为数据并生成列名,如 string_field_N)。我的数据的第一行是 always 标题行。有些表有很多列(超过 30 列),我不想乱用架构语法,因为当架构出现问题(我不知道是什么)时,BigQuery 总是会用无意义的错误消息轰炸。

那么:如何强制它将第一行识别为标题行?如果这不可能,我如何让它以正确的语法吐出它生成的模式,以便我可以编辑它(对于适当的列名)并将其用作导入时的模式?

【问题讨论】:

你能分享一个可以更好地加载的 csv/json 样本吗?可以帮助您找到合适的答案 共享 CSV 文件的前几行会很有帮助,因为 BigQuery 中的架构自动检测存在故障。请参阅下面的回复。 【参考方案1】:

在大多数情况下,BigQuery 中的架构自动检测应该能够将 CSV 文件的第一行检测为列名。列名检测失败的一种情况是,您的 CSV 文件中都有类似的数据类型。例如,BigQuery 架构自动检测将无法检测以下文件的标头名称,因为每个字段都是字符串。

headerA, headerB
row1a, row1b
row2a, row2b
row3a, row3b

UI 中的“要跳过的标题行”选项无助于解决 BigQuery 中架构自动检测的这一缺点。

【讨论】:

【参考方案2】:

如果您遵循 Loading CSV Data from Google Cloud Storage 的 GCP 文档,则您有 option to skip n number of rows:

(可选)一个整数,表示源数据中的标题行数。

该选项在 Web UI 中称为“要跳过的标题行”,但它也可用作 CLI 标志 (--skip_leading_rows) 和 BigQuery API 属性 (skipLeadingRows)

【讨论】:

谢谢,但这是否会强制它将第一行视为标题并从中提取列名?如果没有,那也没多大帮助。 这并不能保证文件的第一行被检测为列名。【参考方案3】:

我建议在这里做两件事:

    预处理您的文件并将文件的最终布局存储在第一行即标题行中 BQ 加载接受 JSON 模式文件形式的附加参数,使用它来显式定义表模式并将此文件作为参数传递。如果需要,您可以随时灵活地更改架构

不建议允许 BQ 自动检测架构。

【讨论】:

好的,但正如我所说,每当我尝试为它提供 JSON 模式时,它都会滚动并死掉,没有任何类型的信息性错误消息。如果我可以让它吐出一个我可以编辑(更改字段名称)并用于重新加载表的架构,那会有所帮助,但我看不到这样做的方法。 通常情况并非如此。希望您的 JSON 在语法上正确且可解析。【参考方案4】:

是的,您可以使用 bq show 修改现有架构(又名 DDL)..

bq show --schema --format=prettyjson project_id:dataset.table > myschema.json

请注意,这将导致您一起创建一个新的 BQ 表。

【讨论】:

如果您使用的是云控制台,请使用 Google 云外壳。或者,在使用您的项目设置配置了 Google 云 SDK 的任何主机上。 好的,试过这个并且能够生成模式 JSON。将其复制到“创建表”表单中模式的文本输入字段中,以尝试以这种方式重新创建表。它翻滚并死机,并显示相同的错误消息:“读取数据时出错,错误消息:CSV 表遇到太多错误,放弃。行:1;错误:1。请查看 errors[] 集合以获取更多详细信息。 "我不知道在哪里可以找到它或它意味着什么。我还尝试使用“+ 添加字段”选项一次输入模式定义一个字段。同样的事情发生了。 让 BigQuery 将此 CSV 加载到表中的唯一方法是使用自动架构生成,但它不会选择字段名称的标题行。老实说,我现在已经准备好放弃了。 让我们一步一步诊断。您是否能够仅使用您刚刚创建的 JSON 文件提供的 DDL 创建一个空表?大声思考,问题可能出在其他地方。【参考方案5】:

如果整个 csv 文件的“列名”类型和“数据类型”都相同,则 BigQuery 会将“列名”误解为数据。并为该列添加一个自生成的名称。我找不到任何技术方法来解决这个问题。 所以我采取了另一种方法。 如果数据不敏感,则添加另一列,其中包含字符串类型的“列名称”。并且列中的所有值都是数字类型。前任。列名“Test”,所有值为 0。将文件上传到 BigQuery 并使用此查询删除列名。

ALTER TABLE <table name> DROP COLUMN <Test>

根据您的表格进行更改。

【讨论】:

以上是关于需要帮助创建将 CSV 加载到 BigQuery 的架构的主要内容,如果未能解决你的问题,请参考以下文章

将 csv 文件加载到 BIGquery 中并在插入数据时添加日期列

将 csv 文件从云存储批量加载到 bigquery

将CSV加载到BigQuery表中的问题

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

BigQuery:加载 excel 文件

在 Dataflow 中使用啥转换来合并具有不同列的 csv 文件,同时将它们加载到 BigQuery?