我尝试了几种csv格式(不同的转义字符,引号和其他设置)从MySQL导出数据并将其导入BigQuery,但我无法找到适用于所有情况的解决方案.
Google SQL需要以下代码才能从/导入/导出MySQL.虽然,Cloud SQL不是BigQuery,但它是一个很好的起点:
SELECT * INTO OUTFILE 'filename.csv' CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '' FROM table
目前我使用以下命令将压缩的csv导入BigQuery:
bq --nosync load -F "," --null_marker "NULL" --format=csv PROJECT:DATASET.tableName gs://bucket/data.csv.gz table_schema.json
一方面,bq-command不允许设置转义字符("
由另一个转义"
,这似乎是一个定义良好的CSV格式).另一方面\"
,因为MySQL导出的转义字符会导致"N
Null值,这也不起作用:
CSV table references column position 34, but line starting at position:0 contains only 34 columns. (error code: invalid)
所以我的问题是:如何在SQL中为MySQL编写一个(与表无关的)导出命令,这样生成的文件就可以加载到BigQuery中.应该使用哪个转义字符以及如何处理/设置空值?
我一直在运行同样的问题,这是我的解决方案:
首先,以这种方式从MySQL导出数据:
SELECT * INTO OUTFILE 'filename.csv' CHARACTER SET 'utf8' FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '' FROM table
这实际上是一个tsv文件(制表符分隔值),但您可以将它们导入为csv思想.
这样您就可以使用以下参数将其导入大查询:
bq load --field_delimiter="\t" --null_marker="\N" --quote="" \ PROJECT:DATASET.tableName gs://bucket/data.csv.gz table_schema.json
如果MySQL数据库中的任何字段包含制表符(\t
),它将破坏您的列.为了防止您REPLACE(
在列上添加SQL函数,它将从制表符转换为空格.
如果在大查询的Web界面中设置表模式,则无需在每次加载CSV时指定它.
我希望这适合你.