是什么使这两个查询返回不同的结果?
What could make these two queries returning different results?
我在 Amazon Athena 上有一个 ELB 日志 table,我正在尝试通过 url 请求每日请求。 table 的结构是 the one described here,但我还添加了日、月和年的分区,以便按日、月等查询日志...
我正在使用这样的查询对 table 进行分区:
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 有什么区别?他们不应该是等价的吗?
有分区名称和分区位置。
分区:
month=03,day=01
month=03,day=*
当您在 day
列上无条件查询时,两个分区都匹配。
碰巧的是,它们包含相同的文件(因为它们共享物理位置)。
由于(显然)没有对正在读取的文件进行重复数据删除(分区应该是不重叠的),所以相同的数据文件被读取了两次。
我在 Amazon Athena 上有一个 ELB 日志 table,我正在尝试通过 url 请求每日请求。 table 的结构是 the one described here,但我还添加了日、月和年的分区,以便按日、月等查询日志... 我正在使用这样的查询对 table 进行分区:
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 有什么区别?他们不应该是等价的吗?
有分区名称和分区位置。
分区:
month=03,day=01
month=03,day=*
当您在 day
列上无条件查询时,两个分区都匹配。
碰巧的是,它们包含相同的文件(因为它们共享物理位置)。
由于(显然)没有对正在读取的文件进行重复数据删除(分区应该是不重叠的),所以相同的数据文件被读取了两次。