web-dev-qa-db-ja.com

RedShiftでテーブルを安全にアンロード/コピーする方法は?

RedShiftでは、アンロード/コピーを使用してデータをS3に移動し、ロードしてredshiftに戻すと便利ですが、毎回区切り文字を選択するのは難しいと感じています。正しい区切り文字は、テーブルの内容に関連しています。ロードエラーが発生するたびに区切り文字を変更する必要がありました。

たとえば、次のコマンドを使用してテーブルをアンロード/コピーすると、次のようになります。

unload ('select * from tbl_example') to 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter '|' addquotes allowoverwrite;

copy tbl_example2 from 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter '|' removequotes;

テーブルの内容が"||"のフィールドがある場合、ロードエラーが発生します。次に、区切り文字 '|'を変更する必要があります'、'のような別のものに切り替えて、もう一度やり直してください。運が悪ければ、成功するには何度も試行する必要があります。

テーブルの内容に関係のない赤方偏移テーブルをアンロード/コピーする方法があるかどうか疑問に思っています。これは、テーブルに格納されている奇妙な文字列に関係なく常に成功します。

11
ciphor

最後に、アンロードコマンドとコピーコマンドの両方にescapeを追加するための正しいアプローチを見つけました。

unload ('select * from tbl_example') to 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter '|' addquotes escape allowoverwrite;

copy tbl_example2 from 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter '|' removequotes escape;

nloadコマンドのescapeを使用すると、区切られたアンロードファイルのCHAR列とVARCHAR列の場合、次の文字が出現するたびにエスケープ文字(\)が配置されます。

  • 改行:\ n
  • キャリッジリターン:\ r
  • アンロードされたデータに指定された区切り文字。
  • エスケープ文字:\
  • 引用符: "または '(UNLOADコマンドでESCAPEとADDQUOTESの両方が指定されている場合)。

また、copyコマンドのescapeを使用すると、入力データの円記号()はエスケープ文字として扱われます。バックスラッシュ文字の直後の文字は、通常は特別な目的を果たす文字であっても、現在の列値の一部としてテーブルにロードされます。たとえば、このオプションを使用して、区切り文字、引用符、埋め込み改行、またはこれらの文字のいずれかが列値の正当な部分である場合にエスケープ文字自体をエスケープできます。

30
ciphor

以下のようにアンロードしてみてください

 unload ('select * from tbl_example') to 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter as ',' addquotes escape

それをロードバックするには、以下のように使用します

copy tbl_example2 from 's3://s3bucket/tbl_example' CREDENTIALS 'aws_access_key_id=xxx;aws_secret_access_key=xxx' delimiter ',' removequotes escape;

これは、データが間にあるかどうかに関係なく機能します。

1

このトピックは多くの場所で取り上げられるため、UNLO​​Ad/extractプロセスをDockerサービスにパッケージ化することにしました。すべてのコードはGithubにあるため、そのまま使用するか、基になるPythonコードを取得して独自のバージョンを作成できます: https://github.com/openbridge/ob_redshift_unload

実行時の構成を介して、区切り文字、日付、およびアドホックSQLを設定できます。これにより、ヘッダー行もエクスポートされます。これは、実行が少し複雑です。

ランタイムオプションのいくつかを次に示します。

-t: The table you wish to UNLOAD
-f: The S3 key at which the file will be placed
-s (Optional): The file you wish to read a custom valid SQL WHERE clause from. This will be sanitized then inserted into the UNLOAD command.
-r (Optional): The range column you wish to use to constrain the results. Any type supported by Redshift's BETWEEN function is accepted here (date, integer, etc.)
-r1 (Optional): The desired start range to constrain the result set
-r2 (Optional): The desired end range to constrain the result set

注:-sと-dは相互に排他的であり、一緒に使用することはできません。どちらも使用されていない場合、スクリプトはデフォルトでWHERE句を指定せず、テーブル全体を出力します。

次に、次のように実行してアンロードできます。

docker run -it -v /local/path/to/my/config.json:/config.json openbridge/ob_redshift_unload python /unload.py -t mytable -f s3://dest-bucket/foo/bar/output_file.csv -r datecol -r1 2017-01-01 -r2 2017-06-01

目標は、デフォルトのUNLOADプロセスを拡張し、出力生成の一貫性を確保するのに役立つものにラップすることでした。

機能/機能の詳細を説明する記事は次のとおりです。 https://blog.openbridge.com/how-to-easily-extract-data-from-Amazon-redshift-4e55435f70

0
Thomas Spicer