druid 查询接口的使用

来源:互联网 发布:淘宝的渠道管理在哪里 编辑:程序博客网 时间:2024/06/05 16:25

核心
druid 查询接口的使用

druid的查询接口是HTTP REST 风格的查询方式,使用HTTP REST 风格查询(Broker,Historical,或者Realtime)节点的数据,查询参数为JSON格式,每个节点类型都会暴露相同的REST查询接口

curl -X POST '<queryable_host>:<port>/druid/v2/?pretty' -H 'Content-Type:application/json' -d @<query_json_file>

queryable_host: broker节点ip port: broker 节点端口 默认是8082

curl -L -H'Content-Type: application/json' -XPOST --data-binary @quickstart/aa.json http://10.20.23.41:8082/druid/v2/?pretty

query 查询的类型有
1、Timeseries
2、TopN
3、GroupBy
4、Time Boundary
5、Segment Metadata
6、Datasource Metadata
7、Search
8、select

其中 Timeseries、TopN、GroupBy为聚合查询,Time Boundary、Segment Metadata、Datasource Metadata 为元数据查询,Search 为搜索查询

1、Timeseries
对于需要统计一段时间内的汇总数据,或者是指定时间粒度的汇总数据,druid可以通过Timeseries来完成。

timeseries 查询包括如下的字段

字段名            描述                             是否必须queryType      查询类型,这里只有填写timeseries查询     是dataSource       要查询的数据集                       是descending          是否降序                           否intervals    查询的时间范围,默认是ISO-8601格式         是granularity   查询结果进行聚合的时间粒度            是filter                过滤条件                     否aggregations         聚合                         是      postAggregations    后期聚合                            否context             指定一些查询参数                    否

timeseries输出每个时间粒度内指定条件的统计信息,通过filter指定条件过滤,通过aggregations和postAggregations指定聚合方式。timeseries不能输出维度信息,granularity支持all,none,second,minute,hour,day,week,month,year等维度

all:汇总1条输出 none:不推荐使用

其他的:则输出相应粒度统计信息

查询的json

{  "aggregations": [    {      "type": "count",       "name": "count"    }  ],   "intervals": "1917-08-25T08:35:20+00:00/2017-08-25T08:35:20+00:00",   "dataSource": "app_auto_prem_qd_pp3",   "granularity": "all",   "postAggregations": [],   "queryType": "timeseries"}

等同于sql select count(1) from app_auto_prem_qd_pp3

TopN
返回指定维度和排序字段的有序top-n序列.TopN支持返回前N条记录,并支持指定的Metric为排序依据

{  "metric": "sum__total_standard_premium",   "aggregations": [    {      "type": "doubleSum",       "fieldName": "total_standard_premium",       "name": "sum__total_standard_premium"    }  ],   "dimension": "is_new_car",   "intervals": "1917-08-29T20:05:10+00:00/2017-08-29T20:05:10+00:00",   "dataSource": "app_auto_prem_qd_pp3",   "granularity": "all",   "threshold": 50000,   "postAggregations": [],   "queryType": "topN"}
字段名            描述                             是否必须queryType     对于TopN查询,这个必须是TopN              是dataSource       要查询的数据集                         是intervals    查询的时间范围,默认是ISO-8601格式           是filter                过滤条件                       否aggregations           聚合                       是postAggregations      后期聚合                      否dimension   进行TopN查询的维护,一个TopN查询只能有一个维度  是threshold          TopN中的N值                        是metric               进行统计并排序的metric             是context             指定一些查询参数                    否

metric:是TopN专属
方式:

"metric":"<metric_name>" 默认情况是升序排序的"metric" : {    "type" : "numeric", //指定按照numeric 降序排序    "metric" : "<metric_name>"}"metric" : {    "type" : "inverted", //指定按照numeric 升序排序    "metric" : "<metric_name>"}"metric" : {    "type" : "lexicographic", //指定按照字典序排序    "metric" : "<metric_name>"}"metric" : {    "type" : "alphaNumeric", //指定按照数字排序    "metric" : "<metric_name>"}

需要注意的是,TopN是一个近似算法,每一个segment返回前1000条进行合并得到最后的结果,如果dimension
的基数在1000以内,则是准确的,超过1000就是近似值

groupBy
groupBy 类似于SQL中的group by 操作,能对指定的多个维度进行分组,也支持对指定的维度进行排序,并输出limit行数,同时支持having操作

{  "dimensions": [    "is_new_car",     "status"  ],   "aggregations": [    {      "type": "doubleSum",       "fieldName": "total_standard_premium",       "name": "sum__total_standard_premium"    }  ],   "having": {    "type": "greaterThan",     "aggregation": "sum__total_standard_premium",     "value": "484000"  },   "intervals": "1917-08-29T20:26:52+00:00/2017-08-29T20:26:52+00:00",   "limitSpec": {    "limit": 2,     "type": "default",     "columns": [      {        "direction": "descending",         "dimension": "sum__total_standard_premium"      }    ]  },   "granularity": "all",   "postAggregations": [],   "queryType": "groupBy",   "dataSource": "app_auto_prem_qd_pp3"}

等同于sql select is_new_car,status,sum(total_standard_premium) from app_auto_prem_qd_pp3 group by is_new_car,status limit 50000 having sum(total_standard_premium)>484000

{  "version" : "v1",  "timestamp" : "1917-08-30T04:26:52.000+08:00",  "event" : {    "sum__total_standard_premium" : 8.726074368E9,    "is_new_car" : "是",    "status" : null  }}, {  "version" : "v1",  "timestamp" : "1917-08-30T04:26:52.000+08:00",  "event" : {    "sum__total_standard_premium" : 615152.0,    "is_new_car" : "否",    "status" : null  }  }
字段名            描述                             是否必须queryType      对于GroupBy查询,该字段必须是GroupBy     是dataSource          要查询的数据集                     是dimensions      进行GroupBy查询的维度集合               是limitSpec           统计结果进行排序                    否having             对统计结果进行筛选                    否granularity            查询结果进行聚合的时间粒度         是 postAggregations        后聚合器                       否intervals        查询的时间范围,默认是ISO-8601格式        是context             指定一些查询参数                    否

GroupBy特有的字段为limitSpec 和having

limitSpec
指定排序规则和limit的行数

{    "type" : "default",    "limit":<integer_value>,    "columns":[list of OrderByColumnSpec]}

其中columns是一个数组,可以指定多个排序字段,排序字段可以使demension 或者metric 指定排序规则的拼写方式

{    "dimension" :"<Any dimension or metric name>",      "direction" : <"ascending"|"descending">} "limitSpec": {    "limit": 2,     "type": "default",     "columns": [      {        "direction": "descending",         "dimension": "sum__total_standard_premium"      },     {        "direction": "ascending",         "dimension": "is_new_car"      }     ]  }

having 类似于SQL中的having操作

select

select 类似于sql中select操作,select用来查看druid中的存储的数据,并支持按照指定过滤器和时间段查看指定维度和metric,能通过descending字段指定排序顺序,并支持分页拉取,但不支持aggregations和postAggregations
json 实例如下

{  "dimensions": [      "status",      "is_new_car"  ],   "pagingSpec":{  "pagingIdentifiers":{},  "threshold":3  },  "intervals": "1917-08-25T08:35:20+00:00/2017-08-25T08:35:20+00:00",   "dataSource": "app_auto_prem_qd_pp3",   "granularity": "all",   "context" : {   "skipEmptyBuckets" : "true"  },  "queryType": "select"}

相当于SQL语句 select status,is_new_car from app_auto_prem_qd_pp3 limit 3

[ {  "timestamp" : "2017-08-22T14:00:00.000Z",  "result" : {    "pagingIdentifiers" : {      "app_auto_prem_qd_pp3_2017-08-22T08:00:00.000+08:00_2017-08-23T08:00:00.000+08:00_2017-08-22T18:11:01.983+08:00" : 2    },    "dimensions" : [ "is_new_car", "status" ],    "metrics" : [ "total_actual_premium", "count", "total_standard_premium" ],    "events" : [ {      "segmentId" : "app_auto_prem_qd_pp3_2017-08-22T08:00:00.000+08:00_2017-08-23T08:00:00.000+08:00_2017-08-22T18:11:01.983+08:00",      "offset" : 0,      "event" : {        "timestamp" : "2017-08-22T22:00:00.000+08:00",        "status" : null,        "is_new_car" : "是",        "total_actual_premium" : 1012.5399780273438,        "count" : 1,        "total_standard_premium" : 1250.050048828125      }    }, {      "segmentId" : "app_auto_prem_qd_pp3_2017-08-22T08:00:00.000+08:00_2017-08-23T08:00:00.000+08:00_2017-08-22T18:11:01.983+08:00",      "offset" : 1,      "event" : {        "timestamp" : "2017-08-22T22:00:00.000+08:00",        "status" : null,        "is_new_car" : "是",        "total_actual_premium" : 708.780029296875,        "count" : 1,        "total_standard_premium" : 1250.050048828125      }    }, {      "segmentId" : "app_auto_prem_qd_pp3_2017-08-22T08:00:00.000+08:00_2017-08-23T08:00:00.000+08:00_2017-08-22T18:11:01.983+08:00",      "offset" : 2,      "event" : {        "timestamp" : "2017-08-22T22:00:00.000+08:00",        "status" : null,        "is_new_car" : "是",        "total_actual_premium" : 1165.489990234375,        "count" : 1,        "total_standard_premium" : 1692.800048828125      }    } ]  }} ]

在pagingSpec中指定分页拉取的offset和条目数,在结果中会返回下次拉取的offset,

 "pagingSpec":{  "pagingIdentifiers":{},  "threshold":3,  "fromNext" :true  }

Search

search 查询返回匹配中的维度,类似于SQL中的topN操作,但是支持更多的匹配操作,
json示例如

{  "queryType": "search",  "dataSource": "app_auto_prem_qd_pp3",  "granularity": "all",  "limit": 2,  "searchDimensions": [    "data_source",    "department_code"  ],  "query": {    "type": "insensitive_contains",    "value": "1"  },  "sort" : {    "type": "lexicographic"  },  "intervals": [    "1917-08-25T08:35:20+00:00/2017-08-25T08:35:20+00:00"  ]} 

searchDimensions搜索的维度

字段名            描述                             是否必须queryType         对于search查询,该字段必须是search    是dataSource            要查询的数据集                  是searchDimensions     运行search的维度                 是limit               对统计结果进行限制             否(默认1000)granularity        查询结果进行聚合的时间粒度         是 intervals           查询的时间范围,默认是ISO-8601格式   是sort                  指定搜索结果排序                  否query               查询操作                          是context              指定一些查询参数                   否filter                 过滤器                        否

需要注意的是,search只是返回匹配中维度,不支持其他聚合操作,如果要将search作为查询条件进行topN,groupBy或timeseries等操作,则可以在filter字段中
指定各种过滤方式,filter字段也支持正则匹配,
查询结果如下:

[ {  "timestamp" : "2017-08-22T08:00:00.000+08:00",  "result" : [ {    "dimension" : "data_source",    "value" : "226931204023",    "count" : 2  }, {    "dimension" : "data_source",    "value" : "226931204055",    "count" : 7  } ]} ]

查询的选择

1、在可能的情况下,建议使用Timeseries和TopN查询而不是GroupBy,GroupBy是最灵活的查询,也是最差的表现。对于不需要对维度进行分组的聚合,Timeseries比GroupBy查询要快,对于单个维度进行分组和排序,TopN查询比GroupBy更加优化

原创粉丝点击