1

我在 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'
4

2 回答 2

1

频谱不是那么直观。您可能需要将时间戳转换为年、月、日...

而不是像 WHERE (year > x AND year < y) AND (month > x1 AND month < x2) AND ...

看起来很丑。

你可以考虑做点别的:

  1. s3://bucket/dir/date=2018-11-19/time=17:30:00/file.parquet

在这种情况下,您的查询会更简单

哪里(日期<'2018-11-19'和日期>'2018-11-17')和(时间<'17:30:00'和时间>'17:20:00')

或使用 BETWEEN https://docs.aws.amazon.com/redshift/latest/dg/r_range_condition.html

于 2018-12-11T08:44:48.837 回答
0

如果像下面提到的那样创建分区,它将迎合@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'

PS如果它解决了您的目的,请对此进行投票。(我需要 50 个声望才能对帖子发表评论 :))

于 2020-01-24T13:00:24.650 回答