【发布时间】:2019-07-05 10:38:39
【问题描述】:
假设我在 csv 文件中有以下数据:
'"tom","jones","hello,\nMy name is tom"\x01\n"sarah","smith","hello"\x01\n'
行终止符是\x01\n。是否可以将其直接加载到 GCS 中(无需先对其进行预格式化)?我的思考过程是:
- 使用非标准分隔符(例如
\x00ff)将其加载到 CSV 中,以便在一行中获取所有数据。 - 然后执行基本的 DML 以“清理”数据并重新格式化。
但是,当我们有连续行时,我们会遇到一个问题,因为 BQ 不“支持”(如果您想这样称呼它)行排序。这是我的数据现在在 BQ 中的样子:
我们可以看到行排序不起作用,因此不可能“重新组合数据”,例如,使用 UDF 来获得我们需要的正确 csv 数据。
这里还有其他可能的方法吗?澄清一下,我希望通过 BigQuery 转换已在 GCS 上的 CSV 文件,而无需在加载到 BQ 之前将该文件下载到单独的服务器进行处理。
作为参考,这是我目前正在使用的代码:
# /tmp/schema_external_nonstandard_csv.json
{
"schema": {
"fields": [
{
"name": "data",
"type": "STRING"
}
]
},
"sourceFormat": "CSV",
"sourceUris": [
"gs://XY-bq/ns.csv"
],
"csvOptions": {
"fieldDelimiter": "\u00ff",
"quote": ""
},
"maxBadRecords": 1000000
}
$ bq mk --external_table_definition=/tmp/schema_external_nonstandard_csv.json datadocs-163219:bqtesting.ns
$ bq query --nouse_legacy_sql 'CREATE TABLE `XY-163219.bqtesting.ns1` AS select * from `XY-163219.bqtesting.ns`'
【问题讨论】:
-
确保回答您的第一个问题。
-
@ElliottBrossard 你能澄清一下吗?我回答了。
-
啊,对不起哈哈。我没有意识到你已经回答了你自己的问题:) 忽略。
-
您的文件有多大/多小?
-
@MikhailBerlyant 它们可以是从几行到 100GB 左右的任何大小。真的,这取决于。
标签: csv google-cloud-platform google-bigquery google-cloud-dataflow