1

我正在尝试使用他们的 COPY 命令(http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html)将 apache 样式的日志加载到亚马逊 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]');  

但是,在此示例中,时区部分 (-0700) 被忽略,因为 Amazon Redshift 仍然不支持时区。如果您使用这种方式,您应该单独处理时区问题,例如使用 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绝对可以加载的日期时间字段。假设加载的时间是 UTC,您可以使用convert_timezone.

于 2013-07-31T20:32:30.910 回答