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

Posted

技术标签:

【中文标题】Druid -> 按本机查询的时间戳以外的另一列对数据进行排序【英文标题】:Druid -> Order data by another column than timestamp by native queries 【发布时间】:2022-01-12 14:05:14 【问题描述】:

我在德鲁伊中使用扫描查询。 我正在寻找一种使用某些查询对数据进行排序的方法。 我该怎么做?

现在我有:

DataSource: Data,
Intervals:  "1000"/"2000",
Limit:      10
Legacy:     true, 

我有列“值”,我想按此列对数据进行排序(不按时间戳)并从表中返回每一列,但按“值”排序。

类似:

SELECT __time, value, company, count
FROM shares
ORDER BY 1 ASC
WHERE value > 200

【问题讨论】:

【参考方案1】:

用***的测试数据尝试了类似的查询:

SELECT namespace, channel, cityName, sum_added
FROM "wikipedia_demo" r 
WHERE sum_added > 30
ORDER BY sum_added DESC

导致错误:

Error: Unknown exception

Cannot build plan for query: SELECT namespace, channel, cityName, sum_added FROM "wikipedia_demo" r WHERE sum_added > 30 ORDER BY sum_added DESC

org.apache.druid.java.util.common.ISE

原因是 ORDER BY 只允许在 GROUP BY 列、聚合表达式上,或者如果没有进行分组,那么只能在 __time 上使用。 看看这里的文档:https://druid.apache.org/docs/latest/querying/sql.html#order-by

如果您不进行聚合,您仍然可以使用 GROUP BY 选择所有 SELECT 表达式,然后 ORDER BY 其中任何一个,如下所示:

SELECT namespace, channel, cityName, sum_added
FROM "wikipedia_demo" r 
WHERE sum_added > 30
GROUP BY 1,2,3,4
ORDER BY sum_added DESC

注意:由于是时间序列数据,最好在 __time 上包含一个条件以避免扫描整个表。

【讨论】:

你的解决方案在我这边不起作用,它在德鲁伊控制台中工作,但是当我在 Golang 中创建类似的解决方案时,当我有限制时它什么都不做:500【参考方案2】:

另请参阅以下文档页面,了解您对scan 查询的订单选项。 https://druid.apache.org/docs/latest/querying/scan-query.html#time-ordering

【讨论】:

如标题:按时间戳以外的另一列排序数据,您的链接有:#time-ordering【参考方案3】:

是的。这是一个单独的问题,但是是的,您可以通过 API 而不是原生 JSON 查询提交 SQL。

名为“a_query.json”的 JSON 文件:


  "query":
  "SELECT namespace, channel, cityName, sum_added
   FROM \"wikipedia_demo\" r 
   WHERE sum_added > 30
   GROUP BY 1,2,3,4
   ORDER BY sum_added DESC"

示例 API 调用:

curl -X 'POST' -H 'Content-Type:application/json' -d @/<path_to_file>/a_query.json http://localhost:8888/druid/v2/sql | jq

【讨论】:

【参考方案4】:

SQL 查询对我来说很好用,所以我在 druid 控制台中的 SQL 之前找到了“EXPLAIN PLAN FOR”标签。 Druid 向我展示了 druid native 的 JSON 应该是什么样子。 我以这种方式解决了我的问题。 谢谢

【讨论】:

以上是关于Druid -> 按本机查询的时间戳以外的另一列对数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Apache Druid的SQL查询使用手册

Flutter:按时间戳查询 Firestore 文档

按当前时间戳的 GraphQL 查询过滤器

CVE-2021-25646Apache Druid 远程代码执行漏洞复现

Parquet Data 时间戳列 INT96 尚未在 Druid Overlord Hadoop 任务中实现

Apache Druid GroupBy 虚拟列