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 -> 按本机查询的时间戳以外的另一列对数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章
CVE-2021-25646Apache Druid 远程代码执行漏洞复现