2013-05-30 73 views
1

我想使用他们的COPY命令(http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html)将apache样式的日志加载到亚马逊红移群集中,但日期解析存在一些问题。我的日期是这样的:加载apache日志amazon redshift

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

红移[时间格式文档http://docs.aws.amazon.com/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html 说,“你必须指定的日期和时间段之间的空格字符”。因为实际上我在它们之间有一个冒号,所以我检查了如果我在我的时间格式中使用它,结果是名义上的成功,但是分秒设置为零。

(时区是另一个问题,但它听起来像有没有意图来支持,目前,让我单独对付它)

所以,我的问题:

  1. 有什么方法来解析这个使用COPY?我相信我必须预先处理EC2上的日志文件,或将日期加载为字符串,并将它们解析为红移时适当的时间戳列。任何关于哪个更好的建议?

+0

我遇到同样的问题。我发现的唯一解决方法是您已经发现的解决方案。 – Cory

回答

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 .The perl的命令上述转换为2013-07-31 03:59:41.000它加载精绝成时间字段这一点。假设加载的时间是UTC,则可以使用convert_timezone

3

现在,Amazon Redshift支持使用TIMEFORMAT“自动”选项为COPY命令解析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]'); 

然而,在这个例子中,时区的一部分(-0700),是因为亚马逊红移仍然不支持时区忽略。如果使用这种方式,则应像分别用UTC时区编写日志数据一样处理时区问题。