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

jhkqcmku  于 2022-09-18  发布在  Java
关注(0)|答案(7)|浏览(190)

我尝试了几种CSV格式(不同的转义字符、引号和其他设置),以从MySQL导出数据并将其导入BigQuery,但我无法找到在所有情况下都有效的解决方案。

Google SQL requires以下代码用于从MySQL导入/导出到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-EXPORT的转义字符的\"将导致"N作为空值,这也不起作用:

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

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

sh7euo9m

sh7euo9m1#

我一直在处理同样的问题,以下是我的解决方案:

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', ' '),它将从制表符转换为空格。
1.如果您在BIG Query的Web界面中设置表模式,则不需要在每次加载CSV时指定它。

我希望这对你有用。

de90aj5v

de90aj5v2#

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

CSV或TSV的问题是转义字符。Json实际上并没有这个问题。

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

例如,使用mysqldump流到sqldump-to

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

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

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

sqldump-to创建JSON文件后,只需使用bq命令行工具将其加载到BigQuery中:

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

nue99wik3#

2019更新:

尝试将此作为替代方案:

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

更长的使用方法:

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

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

cetgtptt

cetgtptt4#

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

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

有了这个,你应该能够使用e1d1d1导入数据。你能试一试吗,如果对你不起作用,请告诉我?

deyfvvtc

deyfvvtc5#

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

但是使用封闭器时,我要么遇到了缺省转义符的转义双引号问题,要么出现了空值问题,变成了“N”而不是“N”。

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

第一步:从MySQL导出

配置:

  • 字段分隔符:控制字符001
  • Enloser:‘’(无)

下面是完整的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

第二步:使用gsutil将数据集复制到云硬盘

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

第三步:使用命令行工具加载大查询数据

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外壳上输入Ctrl+VCtrl+A(更多信息here)。它实际上只是一个字符。
  • 我们不能使用Web界面创建表,因为我们不能将控制字符定义为分隔符。
oug3syen

oug3syen6#

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

  • MYSQL_TABLE_TO_BIG_QUERER.sh*将MySQL中的表导出到CSV,并将模式导出到JSON和SQL文件。然后文件被上传到云存储桶的一个文件夹中。然后将这些文件导入BIG Query。在同一项目(如果不存在)中创建名为{SCHEMA_NAME}_{DATE}的BigQuery数据集。如果表具有数据类型为DATE的列,则该表在BigQuery中分区。

  • MYSQL_SCHEMA_TO_BIG_QUERER.sh*从MySQL模式中提取所有表的列表,并为每个表调用MYSQL_TABLE_TO_BIG_QUERER.sh。该脚本创建CSV文件,并根据需要转换空值。然后,它将它们转移到现有的谷歌存储中,并导入到BIG Query。

sq1bmfud

sq1bmfud7#

如果您的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示例读取数据。

相关问题