我正在尝试将一些CSV文件从Google Cloud Storage加载到BigQuery中,并尝试进行模式生成。有一个自动生成的选项,但是文档记录很少。问题是,如果我选择让BigQuery生成模式,它将在猜测数据类型方面做得不错,但是只有在某些情况下,它才能将数据的第一行识别为标题行,而有时却不能(将第1行处理)行作为数据,并生成列名称(如string_field_N)。我数据的第一行总是 标头行。有些表有很多列(超过30列),我不想弄乱模式语法,因为当模式(我不知道是什么)出了问题时,BigQuery总是会轰炸,并给出无意义的错误消息。
因此:如何强制其将第一行识别为标题行?如果这不可能,那么如何获取它以正确的语法吐出生成的架构,以便我可以对其进行编辑(针对适当的列名)并将其用作导入时的架构?
答案 0 :(得分:0)
如果您遵循Loading CSV Data from Google Cloud Storage的GCP文档,则拥有option to skip n number of rows:
(可选)一个整数,指示源数据中标题行的数量。
该选项在Web UI中称为“要跳过的标题行”,但它也可以用作CLI标志(--skip_leading_rows
)和BigQuery API属性(skipLeadingRows
)
答案 1 :(得分:0)
我建议在这里做两件事:
不建议允许BQ自动检测架构。
答案 2 :(得分:0)
是的,您可以使用bq show修改现有架构(又名DDL)。
bq show --schema --format=prettyjson project_id:dataset.table > myschema.json
请注意,这将导致您一起创建一个新的BQ表。
答案 3 :(得分:0)
模式自动检测应该能够将CSV文件的第一行检测为列名。列名称检测失败的情况之一是,当您在整个CSV文件中都具有相似的数据类型时。例如,由于每个字段都是一个字符串,BigQuery架构自动检测将无法检测以下文件的标头名称。
headerA, headerB
row1a, row1b
row2a, row2b
row3a, row3b
UI中的“要跳过的标题行”选项无助于解决BigQuery中模式自动检测的这一缺陷。
答案 4 :(得分:0)
如果整个 csv 文件的“列名”类型和“数据类型”都相同,则 BigQuery 将该“列名”误解为数据。并为该列添加一个自生成的名称。我找不到任何技术方法来解决这个问题。
所以我采取了另一种方法。
如果数据不敏感,则添加另一个字符串类型为“列名称”的列。以及数字类型列中的所有值。前任。列名“Test”,所有值均为 0。将文件上传到 BigQuery 并使用此查询删除列名。
ALTER TABLE <table name> DROP COLUMN <Test>
根据您的表格进行更改。