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

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

【讨论】:

以上是关于对时间戳查询的数据进行分区的主要内容,如果未能解决你的问题,请参考以下文章

Spark Sql:从时间戳按小时间隔分区

Druid -> 按本机查询的时间戳以外的另一列对数据进行排序

附加到 parquet 文件,由具有重叠时间戳的数据分区

按时间戳分钟在 postgres 中查询

BigQuery 没有以毫秒为单位处理带有分区列的时间戳

如何告诉 Spark 根据范围跳过分区