数据查询。
1.概览
Durid通过提供 http rest风格的查询方式去请求查询节点。通过json文件将查询内容表达出来,结构通过json格式返回,来查询Durid中的数据。通常查询时,发送Post请求到broker节点
curl -X POST '<broker_host>:<port>/druid/v2/?pretty' -H 'Content-Type:application/json' -d @<query_json_file>
Druid的原生查询语言是基于HTTP的JSON,社区里已经提供了许多其他方式的查询。
Available Queries
Druid 有各种的查询方式,查询条件由json属性组成,针对于不同类型的查询,可以通过配置不同的json文件,或者设置json文件的各个属性来查询
聚合查询
- Timeseries
- TopN
- GroupBy
元数据查询
- Time Boundary
- Segment Metadata
- Datasource Metadata
搜索查询
- Search
如何选择适合自己的查询方式
在可能的情况下,建议使用Timeseries和TopN查询而不是GroupBy。GroupBy是最灵活的查询方式,但也具有最差的性能。对于不需要对维度进行分组的聚合,Timeseries明显快于groupBy查询。对于单个维度的分组和排序,topN查询比groupBys更加优化。
取消查询
发送Post请求
curl -X DELETE "http://host:port/druid/v2/{queryId}"
查询失败
如果查询失败,将获得包含具有以下结构的JSON对象的HTTP 500响应:
{
"error" : "Query timeout",
"errorMessage" : "Timeout waiting for task.",
"errorClass" : "java.util.concurrent.TimeoutException",
"host" : "data-239:9001"
}
组件
在逐个介绍各种查询方式之前,先介绍查询会用到的各个组件,如:Filter、Aggregator、Post-aggregator、Query、Interval、和Context。每一个基本的组件都会包含详细的类型
Filter
Filter即过滤器,在查询语句中是一个json对象,用来对维度进行筛选,表示维度满足Filter的行是满足我们需求的数据。类似于SQL中的Where语句。
1.Selector Filter
Selector Filter的功能类似于Sql中的 where key = value 。Selector Filter的Json实例如下:
"filter": { "type": "selector", "dimension": "url", "value": "/" }
2.Regex Filter
Regex Filter允许用户通过正则表达式来筛选维度,任何标准的java正则表达式都支持。
"filter": { "type": "regex", "dimension": "url", "pattern": "<pattern-string>" }
3.Logical Expression Filter
Logical Expression Filter包含and or 和 not 三种过滤器,每一种都支持嵌套,可以构建丰富的逻辑表达式,并与sql的 and or not类似
"filter": { "type": "and", "fileds": [<filter>,<filter>,...] }
"filter": { "type": "or", "fileds": [<filter>,<filter>,...] }
"filter": { "type": "not", "fileds": [<filter>,<filter>,...] }
组合案例:
"filter": {
"type": "and",
"fields": [
{ "type": "selector", "dimension": "sample_dimension1", "value": "sample_value1" },
{ "type": "or",
"fields": [
{ &#