为时间戳查询对数据进行分区

时间:2018-11-19 17:44:41

标签: amazon-redshift amazon-redshift-spectrum

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

2 个答案:

答案 0 :(得分:0)

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

比起WHERE(年> x AND年 x1 AND月看起来很丑。

您可以考虑做其他事情:

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

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

其中(日期<'2018-11-19'AND日期>'2018-11-17')AND(时间<'17:30:00'AND时间> '17:20:00')

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

答案 1 :(得分: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'

P.S。如果可以解决您的目的,请对此进行投票。 (我需要50个信誉才能对帖子发表评论:))