是什么使这两个查询返回不同的结果?

时间:2019-04-11 10:18:48

标签: amazon-athena presto

我在Amazon Athena上有一个ELB日志表,我正在尝试通过url请求每日请求。该表的结构为the one described here,但我还添加了日,月和年的分区,以便按日,月等查询日志。 我正在用这样的查询对表进行分区:

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))

3月1日,我也得到590,但是如果我执行此操作(无日条件),则为

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有什么区别?它们不应该等效吗?

1 个答案:

答案 0 :(得分:1)

有分区名称和分区位置。

分区:

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

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