0

我在 Amazon Athena 上有一个 ELB 日志表,我正在尝试通过 url 请求每日请求。该表的结构是此处描述的结构,但我还为日、月和年添加了分区,用于按日、月等查询日志...我正在使用如下查询对表进行分区:

ALTER TABLE elb_logs ADD IF NOT EXISTS PARTITION (year='2019',month='03',day='*') location 's3://my-logs-bucket/my-load-balancer/AWSLogs/526654419886/elasticloadbalancing/eu-west-1/2019/03/'

然后我询问 2019 年 3 月 1 日的日志条目,如下所示:

SELECT count(*)
    FROM elb_logs
    WHERE year='2019'
    AND month='03'
    AND day='01'

并获得 590 个结果,然后如果我执行此查询:

SELECT count(*), DATE(from_iso8601_timestamp(time))
    FROM elb_logs
    WHERE year='2019'
         AND month='03'
         AND day='*'
    GROUP BY DATE(from_iso8601_timestamp(time))

我也得到 590 作为 3 月 1 日的计数,但是如果我执行这个(没有白天条件):

SELECT count(*), DATE(from_iso8601_timestamp(time))
    FROM elb_logs
    WHERE year='2019'
         AND month='03'
    GROUP BY DATE(from_iso8601_timestamp(time))

我得到 1180 作为结果计数,这是不正确的。为什么是这样?DAY='*'指定和不指定 DAY有什么区别?它们不应该是等价的吗?

4

1 回答 1

1

有分区名称和分区位置。

分区:

  • month=03,day=01
  • month=03,day=*

当您在day列上不带条件查询时,两个分区都匹配。碰巧的是,它们包含相同的文件(因为它们共享其物理位置)。由于(显然)没有对正在读取的文件进行重复数据删除(分区应该是不重叠的),因此相同的数据文件被读取了两次。

于 2019-04-11T14:32:48.933 回答