1

COPY コマンド ( http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html )を使用して、Apache スタイルのログを Amazon Redshift クラスターにロードしようとしていますが、いくつかの問題があります。日付の解析。私の日付は次のようになります。

[10/Oct/2000:13:55:36 -0700]

Redshift [時刻形式ドキュメントhttp://docs.aws.amazon.com/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html には、「日付と時刻のセクションの間にスペース文字を指定する必要があります」と書かれています。実際にはそれらの間にコロンがあるので、それを時間形式で使用するとどうなるかを確認しました。結果は名目上の成功ですが、分と秒はゼロに設定されています。

(タイムゾーンは別問題ですが、現状対応するつもりはないようですので別途対応します)

だから、私の質問:

  1. COPY を使用してこれを解析する方法はありますか?

  2. それ以外の場合は、EC2 でログ ファイルを前処理するか、日付を文字列として読み込んで、redshift の適切なタイムスタンプ列に解析する必要があると思います。どちらが好ましいかについて何かアドバイスはありますか?

4

2 に答える 2

3

Amazon Redshift は、COPY コマンドの TIMEFORMAT 'auto' オプションを使用して、Apache アクセス ログのタイムスタンプ形式の解析をサポートするようになりました。ここに例があります。

CREATE TABLE time_test (time_text VARCHAR, time TIMESTAMP);
COPY time_test from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' DELIMITER '\t' TIMEFORMAT 'auto';
SELECT * FROM time_test;

          time_text           |        time
------------------------------+---------------------
 [10/Oct/2000:13:55:36 -0700] | 2000-10-10 13:55:36 

サンプルの TSV データを次に示します。

[10/Oct/2000:13:55:36 -0700]     [10/Oct/2000:13:55:36 -0700]

また、このオプションは INSERT と UPDATE で機能します。次の sql でも同じ結果が得られます。

INSERT INTO time_test VALUES ('[10/Oct/2000:13:55:36 -0700]', '[10/Oct/2000:13:55:36 -0700]');  

ただし、この例では、Amazon Redshift がまだタイムゾーンをサポートしていないため、タイムゾーンの部分 (-0700) は無視されます。この方法を使用する場合、UTC タイムゾーンでログ データを書き込むなど、タイムゾーンの問題を個別に処理する必要があります。

于 2013-11-20T21:45:33.853 に答える
0

タイムゾーン形式を削除して、そのままロードできます。たとえば、私はこれをやっています:

perl -pi.bak -e 's/(\d\d\d\d-\d\d-\d\d)T(\d\d\:\d\d:\d{2}\.\d{3})Z/\1 \2/g' $FILENAME

ファイルのどこに日付と時刻の形式があり2013-07-31T03:59:41.000Z ます.上記のperlコマンドはこれをに変換2013-07-31 03:59:41.000し、datetimeフィールドに完全に正常にロードします. 読み込まれた時刻が UTC であると仮定すると、 を使用できますconvert_timezone

于 2013-07-31T20:32:30.910 に答える