关于后端:SQL-也能搞复杂时序查询使用-SQL-在-GreptimeDB-上做-Range-查询

1次阅读

共计 3127 个字符,预计需要花费 8 分钟才能阅读完成。

查问并聚合一个「给定长度的工夫范畴的数据」,是时序数据中常见的一种查问模式。例如 PromQL 中的 Range selector,就原生地反对了这种时序查问。但对于通用的数据库查询语言 SQL,这类时序查问很难通过原生的 SQL 实现,所以咱们在 GreptimeDB 中引入了扩大的 SQL Range 查问语法,将时序查问能力与 SQL 高度灵便的表达能力相结合,实现了 SQL 对时序数据查问的原生反对。

✨ 让数据动起来!
应用 SQL 在 GreptimeDB 上实现动静 Range 查问 https://greptime.cn/playground

🔧 点击链接退出咱们的 Playground,立刻体验👆

示例

咱们用一个例子来介绍 Range 查问。上面这张表 temperature 记录了不同城市在不同工夫的气温:

咱们想查问北京从 2023 年 5 月 2 日(工夫戳为 1682985600000)以前的:

  • 每日的日平均气温;
  • 每日的周平均气温;
  • 如果某天的数据点缺失,则以前后两天平均气温均值作为这天的平均气温。

咱们首先从 PromQL 的视角来看如何去写这句查问,对于两条查问,都须要以天为步长进行查问。对于日平均气温,须要向前聚合一天的数据,对于周平均气温,须要每次向前聚合一周的数据,并求出平均值。另外咱们须要应用 @ 将查问工夫对齐到工夫戳 1682985600000

最初的查问为:

-- 日平均气温
avg_over_time(temperature{city="beijing"}[1d] @ 1682985600000) step=1d

-- 周平均气温
avg_over_time(temperature{city="beijing"}[7d] @ 1682985600000) step=1d

但下面的查问存在一些问题。PromQL 强调的是做数据的查问,但不能很好地解决查问中缺失数据点的状况,也就是如何对查问的数据作平滑。PromQL 只是存在 Lookback delta 的机制(具体见:https://promlabs.com/blog/2020/07/02/selecting-data-in-promql…),用一些旧的数据来代替缺失的数据点。这样的默认行为在某些状况下并不是用户想要的。因为 Lookback delta 的机制的存在,会导致聚合的数据携带一些旧值。在默认状况下,PromQL 很难做到数据精确性的管制。并且针对咱们下面提出的数据平滑要求,PromQL 也没有很好的方法实现。

如果从传统的 SQL 登程,因为 SQL 中不存在 Lookback delta 的机制,咱们能够准确地管制咱们数据抉择和聚合的范畴。所见即所得,进行比拟准确的查问。

上述查问实质上是以天为单位,对每天和每周的数据做聚合。针对日平均气温,咱们能够利用 date_trunc 这一 scalar 函数,该函数可能将工夫截断到某一个精度上,咱们应用这个函数将工夫截断到天这一单位,最初再以天为单位对数据进行聚合,就能失去咱们想要的后果:

-- 日平均气温
SELECT
    day,
    avg(temp),
FROM (
    SELECT
        date_trunc('day', ts) as day
        temp,
    FROM
        temperature
    WHERE
        city="beijing" and ts < 1682985600000
)
GROUP BY day;

这样也根本满足了咱们的需要,然而这种查问问题在于:

  • 写起来十分繁琐,须要写子查问;
  • 利用范畴无限,用这种方法只能求出日平均气温,没法求出周平均气温。因为 SQL 中的聚合要求每一条数据只能属于一个 group。然而在时序查问中,如果每次采样的工夫是一星期,步长是一天的话,一条数据必然会被多个 group 应用,针对这种查问传统 SQL 无能为力;
  • 还是没方法解决空白数据填充的问题。

在下面探讨之后,咱们须要思考:这种查问实质上是时序查问,然而咱们所应用的 SQL——尽管有非常灵活的表达能力,但却不是专门为时序数据库设计的。咱们须要一些新的 SQL 扩大语法,在 SQL 中来简略的形容这种时序查问。一些时序数据库如 InfluxDB 提供了 group by time 语法,QuestDB 提供了 Sample By 语法,这些实现为咱们的 Range 查问提供了思路。上面介绍如何应用 GreptimeDB 提供的 Range 语法来进行上述查问。

-- 日平均气温
SELECT
    ts,
    avg(temp) RANGE '1d' FILL LINEAR,
FROM
    temperature
WHERE
    city="beijing" and ts < 1682985600000
ALIGN '1d';

-- 周平均气温
SELECT
    ts,
    avg(temp) RANGE '7d' FILL LINEAR,
FROM
    temperature
WHERE
    city="beijing" and ts < 1682985600000
ALIGN '1d';

咱们为一个 SELECT 语句引入了一个关键字 ALIGN,代表每次时序查问的步长,ALIGN 会将工夫对齐到日历上。在聚合函数后引入了一个 RANGE 关键词,代表在每次数据聚合的范畴,FILL LINEAR 示意数据点为空的时候的数据填充形式,即以数据平均值填充。通过这样的形式,咱们比拟轻松的实现了上文所提出的几个要求。

通过 Range 查问,咱们能够很优雅的在 SQL 中表白时序查问。补救了 SQL 在时序查问上形容能力有余的问题,并且能够联合 SQL 弱小的表达能力,实现更加简单的数据查问性能。

Range 查问还有更灵便的应用形式,具体应用参见文档:
https://docs.greptime.com/reference/sql/range

更多实现逻辑请点击文档链接进行参考。

对于 Greptime 的小常识:

GreptimeDB 作为开源我的项目,欢送对时序数据库、Rust 语言等内容感兴趣的同学们参加奉献和探讨。第一次参加我的项目的同学举荐先从带有 good first issue 标签的 issue 动手,期待在开源社群里遇见你!
Star us on GitHub Now: https://github.com/GreptimeTeam/greptimedb
微信搜寻 GreptimeDB,关注公众号不错过更多技术干货和福利~

对于 Greptime:
Greptime 格睿科技致力于为智能汽车、物联网及可观测等产生大量时序数据的畛域提供实时、高效的数据存储和剖析服务,帮忙客户开掘数据的深层价值。目前次要有以下三款产品:

  • GreptimeDB 是一款用 Rust 语言编写的时序数据库,具备分布式、开源、云原生和兼容性强等特点,帮忙企业实时读写、解决和剖析时序数据的同时升高长期存储老本。
  • GreptimeCloud 能够为用户提供全托管的 DBaaS 服务,可能与可观测性、物联网等畛域高度联合。
  • GreptimeAI 是为 LLM 利用量身定制的可观测性解决方案。
  • 车云一体解决方案是一款深刻车企理论业务场景的时序数据库解决方案,解决了企业车辆数据呈几何倍数增长后的理论业务痛点。

GreptimeCloud 和 GreptimeAI 已正式公测,欢送关注公众号或官网理解最新动静!对企业版 GreptimDB 感兴趣也欢送分割小助手(微信搜寻 greptime 增加小助手)。

官网:https://greptime.cn/
GitHub: https://github.com/GreptimeTeam/greptimedb
文档:https://docs.greptime.cn/
Twitter: https://twitter.com/Greptime
Slack: https://www.greptime.com/slack
LinkedIn: https://www.linkedin.com/company/greptime

正文完
 0