web-dev-qa-db-ja.com

MySQLからBigQueryにデータを移行するためのベストプラクティス

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値を処理/設定する方法は?

13
NaN

私は同じ問題で実行しています、これが私の解決策です:

MySQLからのデータのエクスポート

まず、次の方法でMySQLからデータをエクスポートします。

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

これは実際にはtsvファイル(タブ区切りの値)ですが、csvの考えどおりにインポートできます。

BigQueryにインポートする

このようにして、次のパラメータを使用してBigQueryにインポートできるようになります。

_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', ' ')を列に追加すると、タブからスペースに変換されます。

  2. Big Queryのウェブインターフェースでテーブルスキーマを設定する場合、CSVをロードするたびにテーブルスキーマを指定する必要はありません。

これがあなたのために働くことを願っています。

8
Brian Mayer

次の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"を使用してデータをインポートできるようになります。試してみて、うまくいかない場合はお知らせください。

2
Victor Mota

更新2019:

別の方法としてこれを試してください。

  • MySQLバックアップファイルをCloudSQLインスタンスにロードします。
  • MySQLから直接BigQueryのデータを読み取ります。

より長いハウツー:


mysql2xxxx のようなツールを使用して、エクスポート時の柔軟性を最大限に高めることができます。

mysql2csv任意のクエリを実行でき、出力プロセスはFasterCSVを利用します。これにより、標準のmysqlよりも多くのオプションが提供されます。

1
Felipe Hoffa

MySQLからBigQueryにインポートするというまったく同じ問題があり、データセットに複数のテキスト列が含まれているため、、;のような標準の区切り文字を使用できませんでした。または\ tエンクロージャなしでさえ。

しかし、エンクローザーを使用すると、デフォルトの\エスケープ文字でエスケープする二重引用符の問題、または「エスケープャー」でnull値の問題が発生し、\ 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を使用してBigQueryにデータを読み込む

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 + Vを使用して作成できます。 )Ctrl + A(詳細情報 ここ )。実際には1つの文字です。
  • 制御文字を区切り文字として定義できないため、Webインターフェイスを使用してテーブルを作成することはできません。

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
0
Arjun Mehta

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にインポートします。

0
intotecho