【问题标题】:Loading apache logs in amazon redshift在亚马逊红移中加载 apache 日志
【发布时间】:2013-05-26 07:51:00
【问题描述】:

我正在尝试使用他们的 COPY 命令 (http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html) 将 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 来解析这个?

  2. 否则,我相信我必须在 EC2 上预处理日志文件,或者将日期加载为字符串并将它们解析到 redshift 上的适当时间戳列中。有什么更好的建议吗?

【问题讨论】:

  • 我遇到了同样的问题。迄今为止我发现的唯一解决方法是您已经发现的解决方案。

标签: apache amazon-web-services amazon-redshift


【解决方案1】:

现在,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 时区写入日志数据。

【讨论】:

    【解决方案2】:

    您可以剥离时区格式并照此加载它们。 例如我正在这样做:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2013-06-01
      相关资源
      最近更新 更多