对时间戳查询的数据进行分区
Posted
技术标签:
【中文标题】对时间戳查询的数据进行分区【英文标题】:Partitioning data for a timestamp query 【发布时间】:2018-11-19 17:44:40 【问题描述】:我在 s3 上对数据进行了分区,我想通过频谱访问。当前格式文件结构类似:s3://bucket/dir/year=2018/month=11/day=19/hour=12/file.parquet
我通过解析我用于时间戳的字段ts
,使用胶水对数据进行了分区。我将执行的大多数查询将在 ts
字段上进行,因为它们是比每日更精细的时间戳范围查询(可能跨越多天或少于一天,但通常涉及时间。
我将如何在我的数据上创建每小时(首选,如果需要,每天可以工作)分区,因此当我查询 ts
(或另一个时间戳)字段时,它将正确访问分区。如果需要,我可以使用不同的分区重新创建我的数据。大多数示例/文档只是每天存储数据,并在查询中使用日期字段。
如果需要,我很乐意提供更多信息。
谢谢!
示例查询类似于:
SELECT * FROM spectrum.data
WHERE ts between '2018-11-19 17:30:00' AND '2018-11-20 04:45:00'
【问题讨论】:
请分享您的示例查询? 更新了原帖,如有不清楚之处请告知。 您解决了这个问题吗?我遇到了类似的问题 【参考方案1】:频谱不是那么直观。您可能需要将时间戳转换为年、月、日...
并且比做类似 WHERE (year > x AND year x1 AND month
看起来很丑。
你可以考虑做点别的:
-
s3://bucket/dir/date=2018-11-19/time=17:30:00/file.parquet
在这种情况下,您的查询会更简单
在哪里(日期'2018-11-17')和(时间'17:20:00')
或使用 BETWEEN https://docs.aws.amazon.com/redshift/latest/dg/r_range_condition.html
【讨论】:
现在有更好的吗?因为我们搬了 3 年多。我遇到了同样的问题【参考方案2】:如果分区的创建如下所述,它将迎合@Eumcoz 提出的查询
ALTER TABLE spectrum.data ADD PARTITION (ts='2018-11-19 17:30:00')
LOCATION 's3path/ts=2018-11-19 17:30:00/';
ALTER TABLE spectrum.data ADD PARTITION (ts='2018-11-19 17:40:00')
LOCATION 's3path/ts=2018-11-19 17:40:00/';
ALTER TABLE spectrum.data ADD PARTITION (ts='2018-11-19 17:50:00')
LOCATION 's3path/ts=2018-11-19 17:50:00/';
ALTER TABLE spectrum.data ADD PARTITION (ts='2018-11-20 07:30:00')
LOCATION 's3path/ts=2018-11-20 07:30:00/';
然后,如果您触发此查询,它将返回上述所有分区中的数据:
select * from spectrum.data where ts between '2018-11-19 17:30:00' and '2018-11-20 07:50:00'
附:如果它解决了您的目的,请对此进行投票。 (我需要 50 个声望才能评论帖子:))
【讨论】:
以上是关于对时间戳查询的数据进行分区的主要内容,如果未能解决你的问题,请参考以下文章