mysql - 将数据从 MySQL 迁移到 BigQuery 的最佳实践

标签 mysql csv google-bigquery

我尝试了几种 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

注意事项

  1. 如果您的 MySQL 数据库中的任何字段包含制表符 (\t),它会破坏您的列。为防止这种情况,您可以添加 SQL 函数 REPLACE(<column>, '\t', ' ')在列上,它将从制表符转换为空格。

  2. 如果您在大查询的 Web 界面中设置表架构,则无需在每次加载 CSV 时都指定它。

我希望这对你有用。

关于mysql - 将数据从 MySQL 迁移到 BigQuery 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41774233/

相关文章:

php - 不使用 yii 将值插入到数据库的一列中

python - 索引 1 超出轴 0 的范围,决策树分类的大小为 1 错误

python - 如何在 Google BigQuery 中进行数据透视

mysql删除操作

mysql - MySQL 中可以进行值排序吗?

mysql - Mysql中出现 "Insert into Non-key Column on Duplicate Update"怎么办?

python - 哈希表中的 CSV 然后计算总和

javascript - d3.js : d3. min.js :1 Error: <path> attribute d: Expected number, "MNaN,NaNLNaN,NaN"

google-analytics - 按月分组 Google Analytics/BigQuery

regex - 如何将 YYYYMMDD 转换为 YYYY-MM-DDT00 :00:00+00:00 in BigQuery?