我尝试了几种 csv 格式(不同的转义字符、引号和其他设置)从 MySQL 导出数据并将其导入 BigQuery,但我无法找到适用于所有情况的解决方案。
Google SQL requires以下用于从 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 命令不允许设置转义字符("
被另一个"
转义,这似乎是一个定义明确的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导出数据
首先,以这种方式从MySQL中导出数据:
SELECT * INTO OUTFILE 'filename.csv' CHARACTER SET 'utf8'
FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY ''
FROM table <yourtable>
这实际上是一个 tsv 文件(制表符分隔值),但您可以将它们导入为 csv 思想。
导入大查询
这样你就可以用下面的方法将它导入到大查询中 参数:
bq load --field_delimiter="\t" --null_marker="\N" --quote="" \
PROJECT:DATASET.tableName gs://bucket/data.csv.gz table_schema.json
注意事项
如果您的 MySQL 数据库中的任何字段包含制表符 (
\t
),它会破坏您的列。为防止这种情况,您可以添加 SQL 函数REPLACE(<column>, '\t', ' ')
在列上,它将从制表符转换为空格。如果您在大查询的 Web 界面中设置表架构,则无需在每次加载 CSV 时都指定它。
我希望这对你有用。
关于mysql - 将数据从 MySQL 迁移到 BigQuery 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41774233/