使用指向GCS文件的永久外部表时,使用Google BigQuery缺少行

时间:2018-02-13 20:18:27

标签: google-cloud-platform google-bigquery

我正在使用BigQuery,并使用它来查询Google云端存储中存储桶中的CSV文件。我遇到了一些奇怪的行为 - 只有当CSV中有3行,并且第一行包含任何字段中的字符串时 - 查询表时,第一行丢失。

重现的步骤:

创建myfile.csv

testin,2,2
testing3,3,4

将文件复制到GCS:

gsutil cp myfile.csv gs://bucket/

创建指向gs://bucket/myfile.csv的外部表:

bq mk --external_table_definition=Field1:STRING,Field2:STRING,Field3:INTEGER@CSV=gs://bucket/myfile.csv dataset.table

查询表格以确保其正常工作:

bq query "SELECT * FROM dataset.table;"

应输出以下内容:

Waiting on biquery_job_id_1234567 ... (0s) Current 
status: DONE
+----------+--------+--------+
|  Field1  | Field2 | Field3 |
+----------+--------+--------+
| testin   | 2      |      2 |
| testing3 | 3      |      4 |
+----------+--------+--------+

一切都好转到这个bug ..

myfile.csv更改为如下所示:

1,h,3
testin,2,2
testing3,3,4

覆盖gs://bucket/myfile.csv

gsutil cp myfile.csv gs://bucket/

再次查询dataset.table

bq query "SELECT * FROM dataset.table;"

输出:

Waiting on bigquery_job_78901234 ... (0s) Current status: DONE
+----------+--------+--------+
|  Field1  | Field2 | Field3 |
+----------+--------+--------+
| testin   | 2      |      2 |
| testing3 | 3      |      4 |
+----------+--------+--------+

让我们确保GCS文件具有正确的数据:

gsutil cat gs://bucket/myfile.csv

输出:

1,h,3
testin,2,2
testing3,3,4

好的,有趣的。

更改顶行中的中间值,使myfile.csv如下所示:

1,2,3
testin,2,2
testing3,3,4

覆盖GCS文件:

gsutil cp myfile.csv gs://bucket/

查询表:

bq query "SELECT * FROM dataset.table;"

输出:

Waiting on bigquery_job_4567890 ... (0s) Current status: DONE
+----------+--------+--------+
|  Field1  | Field2 | Field3 |
+----------+--------+--------+
| 1        | 2      |      3 |
| testin   | 2      |      2 |
| testing3 | 3      |      4 |
+----------+--------+--------+

如果第一行包含前两个字段中的字符串,有没有人能够了解哪些情况可能会导致第一行丢失?

谢谢,

1 个答案:

答案 0 :(得分:1)

有一个名为csvOptions.skipLeadingRows的参数,用于指定"标题行的数量"在CSV文件中。

如果未指定skipLeadingRows,BigQuery会尝试自动检测标题行的数量。手动将skipLeadingRows设置为0应禁用此行为。