我尝试了几种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中。应该使用哪个转义字符以及如何处理/设置空值?
7条答案
按热度按时间sh7euo9m1#
我一直在处理同样的问题,以下是我的解决方案:
MySQL数据导出
首先,从MySQL中导出数据:
这实际上是一个TSV文件(制表符分隔的值),但您可以按照CSV的想法导入它们。
导入大查询
这样,您应该能够使用以下参数将其导入到大查询中:
注意事项
1.如果您MySQL数据库中的任何字段包含制表符(
t
),它将打断您的列。为了防止出现这种情况,您可以在列上添加SQL函数REPLACE(<column>, '\t', ' ')
,它将从制表符转换为空格。1.如果您在BIG Query的Web界面中设置表模式,则不需要在每次加载CSV时指定它。
我希望这对你有用。
de90aj5v2#
您可以尝试sqldump-to。它读取任何与MySQL兼容的转储流并输出换行符分隔的JSON,以便轻松导入到BigQuery中。
CSV或TSV的问题是转义字符。Json实际上并没有这个问题。
该工具还支持模式导出,之后需要使用每个列的特定BigQuery数据类型对其进行编辑,但这是一个有用的开端。
例如,使用
mysqldump
流到sqldump-to
:您可能需要修改mysqlump命令以匹配您特定的MySQL配置(例如,远程服务器等)
如果您已经有一个转储文件,该工具还支持多个工作进程,以便更好地利用您的CPU。
sqldump-to
创建JSON文件后,只需使用bq
命令行工具将其加载到BigQuery中:nue99wik3#
2019更新:
尝试将此作为替代方案:
更长的使用方法:
您可以使用mysql2xxxx这样的工具在导出时获得最大的灵活性。
使用
mysql2csv
可以运行任意查询,并且输出过程利用FasterCSV
,这将为您提供比股票MySQL更多的选项。cetgtptt4#
使用以下SQL命令似乎对我有效,使用
\N
生成空值:有了这个,你应该能够使用e1d1d1导入数据。你能试一试吗,如果对你不起作用,请告诉我?
deyfvvtc5#
我也遇到了同样的问题,从MySQL导入到Big Query,由于我的数据集包含几个文本列,我无法使用标准的分隔符,例如,;,甚至\t如果没有封闭符。
但是使用封闭器时,我要么遇到了缺省转义符的转义双引号问题,要么出现了空值问题,变成了“N”而不是“N”。
通过使用以下步骤和配置,我能够使其工作。诀窍是使用control character作为安全分隔符,因为我确信我的数据中没有这样的字符。
第一步:从MySQL导出
配置:
下面是完整的MySQL查询。我使用的是AWS RDS Aurora,因此其语法与标准MySQL(文件写入S3)略有不同:
第二步:使用gsutil将数据集复制到云硬盘
第三步:使用命令行工具加载大查询数据
注意事项
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。
sq1bmfud7#
如果您的MySQL运行在Google Cloud SQL中,您还可以使用联邦查询。
您需要在BigQuery中创建外部连接才能从MySQL示例读取数据。