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

NaN*_*NaN 12 mysql csv google-bigquery

我尝试了几种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
Run Code Online (Sandbox Code Playgroud)

目前我使用以下命令将压缩的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导出的转义字符会导致"NNull值,这也不起作用:

CSV table references column position 34, but line starting at position:0 contains only 34 columns. (error code: invalid)

所以我的问题是:如何在SQL中为MySQL编写一个(与表无关的)导出命令,这样生成的文件就可以加载到BigQuery中.应该使用哪个转义字符以及如何处理/设置空值?

Bri*_*yer 8

我一直在运行同样的问题,这是我的解决方案:

从MySQL导出数据

首先,以这种方式从MySQL导出数据:

SELECT * INTO OUTFILE 'filename.csv' CHARACTER SET 'utf8' 
FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '' 
FROM table <yourtable>
Run Code Online (Sandbox Code Playgroud)

这实际上是一个tsv文件(制表符分隔值),但您可以将它们导入为csv思想.

导入大查询

这样您就可以使用以下参数将其导入大查询:

bq load --field_delimiter="\t" --null_marker="\N" --quote="" \
PROJECT:DATASET.tableName gs://bucket/data.csv.gz table_schema.json
Run Code Online (Sandbox Code Playgroud)

笔记

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

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

我希望这适合你.


Fel*_*ffa 3

2019 年更新:

试试这个作为替代方案:

  • 将 MySQL 备份文件加载到 Cloud SQL 实例中。
  • 直接从 MySQL 读取 BigQuery 中的数据。

更长的操作方法:


您可以使用mysql2xxxx等工具在导出时获得最大的灵活性。

您可以mysql2csv运行任意查询,并且输出过程利用FasterCSV,这将为您提供比普通 mysql 更多的选择。