【问题标题】: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'

【问题讨论】:

  • 请分享您的示例查询?
  • 更新了原帖,如有不清楚之处请告知。
  • 您解决了这个问题吗?我遇到了类似的问题

标签: amazon-redshift amazon-redshift-spectrum


【解决方案1】:

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

并且比做类似 WHERE (year > x AND year x1 AND month

看起来很丑。

你可以考虑做点别的:

  1. 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 个声望才能评论帖子:))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2015-03-07
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多