繁体   English   中英

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

[英]Best Practice to migrate data from MySQL to 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

目前我使用以下命令将压缩的 csv 导入 BigQuery:

bq --nosync load -F "," --null_marker "NULL" --format=csv PROJECT:DATASET.tableName gs://bucket/data.csv.gz table_schema.json

一方面, bq-command 不允许设置转义字符( " is escaped by another " ,这似乎是定义明确的CSV格式)。 另一方面, \"作为 MySQL-export 的转义字符会导致"N as Null-value,这也不起作用:

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

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

我一直遇到同样的问题,这是我的解决方案:

从 MySQL 导出数据

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

SELECT * INTO OUTFILE 'filename.csv' CHARACTER SET 'utf8' 
FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '' 
FROM table <yourtable>

这实际上是一个 tsv 文件(制表符分隔值),但您可以按照 csv 的想法导入它们。

导入 Big Query

通过这种方式,您应该能够使用以下参数将其导入大查询:

bq load --field_delimiter="\t" --null_marker="\N" --quote="" \
PROJECT:DATASET.tableName gs://bucket/data.csv.gz table_schema.json

笔记

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

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

我希望这对你有用。

你可以试试sqldump-to 它读取任何与 MySQL 兼容的转储流并输出换行符分隔的 JSON,以便轻松导入 BigQuery。

CSV 或 TSV 的问题是转义字符。 JSON 并没有真正的问题。

该工具还支持架构导出,之后需要使用每列的特定 BigQuery 数据类型对其进行编辑,但这是一个有用的开端。

例如,使用mysqldump流入sqldump-to

mysqldump -u user -psecret dbname | sqldump-to --dir-output ./dbname --schema

您可能需要修改 mysqldump 命令以匹配您的特定 MySQL 配置(例如远程服务器等)

如果您已有转储文件,该工具还支持多个工作人员以更好地利用您的 CPU。

一旦sqldump-to创建了您的 JSON 文件,只需使用bq命令行工具加载到 BigQuery 中:

bq load --source_format=NEWLINE_DELIMITED_JSON datasetname.tablename tablename.json tablename_schema.json

2019 年更新:

试试这个作为替代:

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

更长的操作方法:


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

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

使用以下 SQL 命令似乎对我有用,使用\\N生成空值:

SELECT * INTO OUTFILE '/tmp/foo.csv' CHARACTER SET 'utf8'  
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY "\\" 
FROM table;

有了这个,您应该能够使用--null_marker="\\N"导入数据。您可以尝试一下,如果它对您不起作用,请告诉我吗?

我遇到了同样的问题,从 MySQL 导入到 Big Query,并且由于我的数据集包含多个文本列,我无法使用标准分隔符,如 , ; 甚至 \\t 没有包围。

但是对于封闭器,我要么遇到了默认 \\ 转义符的转义双引号问题,要么是 " 转义符的空值问题,它变成了 "N 而不是 \\N。

我能够通过使用以下步骤和配置使其工作。 诀窍是使用控制字符作为安全分隔符,因为我确信我的数据中没有这样的字符。

第 1 步:从 MySQL 导出

配置 :

  • 字段分隔符:控制字符 001
  • 封闭器:''(无)

这是完整的 MySQL 查询。 我使用的是 AWS RDS Aurora,因此语法与标准 MySQL 略有不同(文件写入 S3):

SELECT * FROM my_table
INTO OUTFILE S3 's3://xxxxx/tmp/my_table/data'
CHARACTER SET UTF8MB4 
FIELDS TERMINATED BY x'01'
OPTIONALLY ENCLOSED BY ''
MANIFEST OFF 
OVERWRITE ON

第 2 步:使用 gsutil 将数据集复制到云存储

gsutil rsync -m s3://xxxxx/tmp/my_table/ gs://xxxxx/tmp/my_table/

第 3 步:使用 CLI 在 Big Query 上加载数据

bq load --source_format=CSV --field_delimiter=^A --null_marker="\N" --quote="" project:base.my_table gs://xxxxx/tmp/my_table/* ./schema.json

笔记

  • ^A 是控制字符的表示。 您可以通过在 Windows 上输入Alt+001来创建它,在 linux shell 上使用Ctrl+VCtrl+A (更多信息在这里)。 它实际上只是一个字符。
  • 我们无法使用 Web 界面创建表格,因为我们无法将控制字符定义为分隔符。

A MySQL Table to BigQuery Import Script.md会将 MySQL 表或完整架构导出到 Big Query。

mysql_table_to_big_query.sh将表从 MySQL 导出到 CSV,并将架构导出到 JSON 和 SQL 文件。 然后将文件上传到云存储桶的文件夹中。 然后将这些文件导入到大查询中。 BigQuery 数据集在同一个项目(如果不存在)中创建,名称为 {SCHEMA_NAME}_{DATE}。 如果该表有一个数据类型为 DATE 的列,则该表将在 BigQuery 中进行分区。

mysql_schema_to_big_query.sh从 MySQL 模式中提取所有表的列表,并为每个表调用 mysql_table_to_big_query.sh。 该脚本创建 csv 文件,根据需要翻译空值。 然后将它们传输到现有的谷歌存储并导入到大查询中。

如果您的 mysql 在 Google Cloud Sql 中运行,您也可以使用联合查询

CREATE TABLE {output_dataset}.{output_table} AS   select * from EXTERNAL_QUERY('{connection_name', '''SELECT * FROM {input_database}.{input_table}

您需要在 bigquery 中创建一个外部连接以从 mysql 实例读取数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM