MySQLからデータをエクスポートしてBigQueryにインポートするために、いくつかのcsv形式(さまざまなエスケープ文字、引用符、その他の設定)を試しましたが、すべての場合に機能するソリューションを見つけることができませんでした。
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コマンドはエスケープ文字を設定することを許可しません(_"
_は別の_"
_によってエスケープされます。これは明確に定義されているようです [〜#〜] csv [〜 #〜] -フォーマット)。一方、MySQLエクスポートのエスケープ文字としての_\"
_は、Null値としての_"N
_になりますが、これも機能しません。
CSV table references column position 34, but line starting at position:0 contains only 34 columns. (error code: invalid)
だから私の質問は:生成されたファイルをBigQueryにロードできるように、SQLでMySQLの(テーブルに依存しない)エクスポートコマンドを作成する方法です。どのエスケープ文字を使用する必要があり、null値を処理/設定する方法は?
私は同じ問題で実行しています、これが私の解決策です:
まず、次の方法でMySQLからデータをエクスポートします。
_SELECT * INTO OUTFILE 'filename.csv' CHARACTER SET 'utf8'
FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY ''
FROM table <yourtable>
_
これは実際にはtsvファイル(タブ区切りの値)ですが、csvの考えどおりにインポートできます。
このようにして、次のパラメータを使用してBigQueryにインポートできるようになります。
_bq load --field_delimiter="\t" --null_marker="\N" --quote="" \
PROJECT:DATASET.tableName gs://bucket/data.csv.gz table_schema.json
_
MySQLデータベースのいずれかのフィールドにタブ文字(_\t
_)が含まれていると、列が壊れます。これを防ぐには、SQL関数REPLACE(<column>, '\t', ' ')
を列に追加すると、タブからスペースに変換されます。
Big Queryのウェブインターフェースでテーブルスキーマを設定する場合、CSVをロードするたびにテーブルスキーマを指定する必要はありません。
これがあなたのために働くことを願っています。
次のSQLコマンドを使用すると、\N
でnull値を生成するのでうまくいくようです。
SELECT * INTO OUTFILE '/tmp/foo.csv' CHARACTER SET 'utf8'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY "\\"
FROM table;
これにより、--null_marker="\N"
を使用してデータをインポートできるようになります。試してみて、うまくいかない場合はお知らせください。
更新2019:
別の方法としてこれを試してください。
より長いハウツー:
mysql2xxxx のようなツールを使用して、エクスポート時の柔軟性を最大限に高めることができます。
mysql2csv
任意のクエリを実行でき、出力プロセスはFasterCSV
を利用します。これにより、標準のmysqlよりも多くのオプションが提供されます。
MySQLからBigQueryにインポートするというまったく同じ問題があり、データセットに複数のテキスト列が含まれているため、、;のような標準の区切り文字を使用できませんでした。または\ tエンクロージャなしでさえ。
しかし、エンクローザーを使用すると、デフォルトの\エスケープ文字でエスケープする二重引用符の問題、または「エスケープャー」でnull値の問題が発生し、\ Nではなく「N」になりました。
次の手順と構成を使用して、それを機能させることができました。秘訣は、データにそのような文字がないと確信しているので、安全な区切り文字として 制御文字 を使用することです。
構成:
これが完全な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 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
sqldump-to を試すことができます。 MySQL互換のダンプストリームを読み込み、BigQueryに簡単にインポートできるように改行で区切られたJSONを出力します。
CSVまたはTSVの問題は、エスケープ文字です。 JSONには実際にはその問題はありません。
このツールはスキーマのエクスポートもサポートしています。スキーマのエクスポートは、列ごとに特定のBigQueryデータ型を使用して後で編集する必要がありますが、これは便利な最初の一歩です。
たとえば、mysqldump
を使用してsqldump-to
にストリーミングします。
mysqldump -u user -psecret dbname | sqldump-to --dir-output ./dbname --schema
特定のMySQL構成(リモートサーバーなど)に一致するようにmysqldumpコマンドを変更する必要がある場合があります。
すでにダンプファイルがある場合、ツールはCPUをより有効に活用するために複数のワーカーもサポートします。
sqldump-to
がJSONファイルを作成したら、bq
コマンドラインツールを使用してBigQueryに読み込みます。
bq load --source_format=NEWLINE_DELIMITED_JSON datasetname.tablename tablename.json tablename_schema.json
MySQLテーブルをBigQuery Import Script.mdに MySQLテーブルまたは完全なスキーマをBigQueryにエクスポートします。
mysql_table_to_big_query.shは、テーブルをMySQLからCSVにエクスポートし、スキーマをJSONおよびSQLファイルにエクスポートします。次に、ファイルはクラウドバケットのフォルダーにアップロードされます。次に、これらのファイルはBigQueryにインポートされます。 BigQueryデータセットは、同じプロジェクト(存在しない場合)に{SCHEMA_NAME} _ {DATE}という名前で作成されます。テーブルにデータ型DATEの列がある場合、テーブルはBigQueryでパーティション化されます。
mysql_schema_to_big_query.shは、MySQLスキーマからすべてのテーブルのリストを抽出し、それぞれに対してmysql_table_to_big_query.shを呼び出します。スクリプトはcsvファイルを作成し、必要に応じてnullを変換します。次に、それらを既存のGoogleストレージに転送し、BigQueryにインポートします。