druid查询
druid为各种场景提供了丰富的查询类型。 查询由各种JSON属性组合而成,不同类型的查询,JSON属性不同,下面主要介绍常用的查询类型。
1. Components
-
Datasources
一个数据源等价于druid表。此外,一个查询也可以作为数据源,提供类似于子查询的功能。查询数据源目前只支持GroupBy查询
-
Table Data Source
最常用的类型
123456789101112131415161718{
"queryType"
:
"scan"
,
"dataSource"
: {
"type"
:
"table"
,
"name"
:
"wikipedia3"
},
"resultFormat"
:
"list"
,
"columns"
: [
"page"
,
"countryName"
,
"cityName"
,
"countryIsoCode"
],
"intervals"
: [
"2016-06-27/2016-06-28"
],
"limit"
: 5
}
-
Union Data Source
联合数据源中的数据源必须拥有相同的schema。联合查询只能被发送给broker/router节点,不支持直接发送到历史节点
1234{
"type"
:
"union"
,
"dataSources"
: [
"<string_value1>"
,
"<string_value2>"
,
"<string_value3>"
, ... ]
}
-
-
Filters
-
Selector filter
等价于sql的
where countryIsoCode = 'US'
12345678910111213141516171819202122{
"queryType"
:
"scan"
,
"dataSource"
: {
"type"
:
"table"
,
"name"
:
"wikipedia3"
},
"filter"
: {
"type"
:
"selector"
,
"dimension"
:
"countryIsoCode"
,
"value"
:
"US"
},
"resultFormat"
:
"list"
,
"columns"
: [
"page"
,
"countryName"
,
"cityName"
],
"intervals"
: [
"2016-06-27/2016-06-28"
],
"limit"
: 5
}
-
Column Comparison filter
等价于sql的
where countryName = cityName
123456789101112131415161718192021222324{
"queryType"
:
"scan"
,
"dataSource"
: {
"type"
:
"table"
,
"name"
:
"wikipedia3"
},
"filter"
: {
"type"
:
"columnComparison"
,
"dimensions"
: [
"countryName"
,
"cityName"
]
},
"resultFormat"
:
"list"
,
"columns"
: [
"page"
,
"countryName"
,
"cityName"
],
"intervals"
: [
"2016-06-27/2016-06-28"
],
"limit"
: 5
}
-
Regular expression filter
正则表达式,支持标准的java正则表达式,下面的查询表示countryIsoCode以U开头
1234567891011121314151617181920212223{
"queryType"
:
"scan"
,
"dataSource"
: {
"type"
:
"table"
,
"name"
:
"wikipedia3"
},
"filter"
: {
"type"
:
"regex"
,
"dimension"
:
"countryIsoCode"
,
"pattern"
:
"^U"
},
"resultFormat"
:
"list"
,
"columns"
: [
"page"
,
"countryName"
,
"cityName"
,
"countryIsoCode"
],
"intervals"
: [
"2016-06-27/2016-06-28"
],
"limit"
: 5
}
-
Logical expression filters
支持and or not,下面的等价于
where countryIsoCode = 'US' and cityName = 'New York'
123456789101112131415161718192021222324252627282930313233{
"queryType"
:
"scan"
,
"dataSource"
: {
"type"
:
"table"
,
"name"
:
"wikipedia3"
},
"filter"
: {
"type"
:
"and"
,
"fields"
: [
{
"type"
:
"selector"
,
"dimension"
:
"countryIsoCode"
,
"value"
:
"US"
},
{
"type"
:
"selector"
,
"dimension"
:
"cityName"
,
"value"
:
"New York"
}
]
},
"resultFormat"
:
"list"
,
"columns"
: [
"page"
,
"countryName"
,
"cityName"
,
"countryIsoCode"
],
"intervals"
: [
"2016-06-27/2016-06-28"
],
"limit"
: 5
}
-
JavaScript filter
1234567891011121314151617181920212223{
"queryType"
:
"scan"
,
"dataSource"
: {
"type"
:
"table"
,
"name"
:
"wikipedia3"
},
"filter"
: {
"type"
:
"javascript"
,
"dimension"
:
"countryIsoCode"
,
"function"
:
"function(value) { return (value == 'US' || value == 'CN') }"
},
"resultFormat"
:
"list"
,
"columns"
: [
"page"
,
"countryName"
,
"cityName"
,
"countryIsoCode"
],
"intervals"
: [
"2016-06-27/2016-06-28"
],
"limit"
: 5
}
-
Search filter
用于部分字符串匹配,如下面的表示包含foo,并且对大小写不敏感
12345678910{
"filter"
: {
"type"
:
"search"
,
"dimension"
:
"product"
,
"query"
: {
"type"
:
"insensitive_contains"
,
"value"
:
"foo"
}
}
}
-
In filter
等价于
where countryIsoCode in ('US', 'CN')
1234567891011121314151617181920212223{
"queryType"
:
"scan"
,
"dataSource"
: {
"type"
:
"table"
,
"name"
:
"wikipedia3"
},
"filter"
: {
"type"
:
"in"
,
"dimension"
:
"countryIsoCode"
,
"values"
: [
"US"
,
"CN"
]
},
"resultFormat"
:
"list"
,
"columns"
: [
"page"
,
"countryName"
,
"cityName"
,
"countryIsoCode"
],
"intervals"
: [
"2016-06-27/2016-06-28"
],
"limit"
: 5
}
-
Like filter
等价于
where countryIsoCode like '%U'
1234567891011121314151617181920212223{
"queryType"
:
"scan"
,
"dataSource"
: {
"type"
:
"table"
,
"name"
:
"wikipedia3"
},
"filter"
: {
"type"
:
"like"
,
"dimension"
:
"countryIsoCode"
,
"pattern"
:
"%U"
},
"resultFormat"
:
"list"
,
"columns"
: [
"page"
,
"countryName"
,
"cityName"
,
"countryIsoCode"
],
"intervals"
: [
"2016-06-27/2016-06-28"
],
"limit"
: 5
}
-
Bound filter
等价于
"CN" < countryIsoCode < "US"
12345678910111213141516171819202122232425262728{
"queryType"
:
"scan"
,
"dataSource"
: {
"type"
:
"table"
,
"name"
:
"wikipedia3"
},
"filter"
: {
"type"
:
"bound"
,
"dimension"
:
"countryIsoCode"
,
"lower"
:
"CN"
,
"lowerStrict"
:
true
,
"upper"
:
"US"
,
"ordering"
:
"numeric"
,
"upperStrict"
:
true
,
"ordering"
:
"lexicographic"
},
"resultFormat"
:
"list"
,
"columns"
: [
"page"
,
"countryName"
,
"cityName"
,
"countryIsoCode"
],
"intervals"
: [
"2016-06-27/2016-06-28"
],
"limit"
: 5
}
-
-
Aggregations
-
Count aggregator
12345678select
page,
count
(*)
as
num
from
wikipedia3
where
"__time"
BETWEEN
TIMESTAMP
'2016-06-27 00:00:00'
AND
TIMESTAMP
'2016-06-28 00:00:00'
group
by
page
order
by
num
desc
limit 5
1234567891011121314151617{
"queryType"
:
"topN"
,
"dataSource"
:
"wikipedia3"
,
"dimension"
:
"page"
,
"threshold"
: 5,
"metric"
:
"num"
,
"granularity"
:
"all"
,
"aggregations"
: [
{
"type"
:
"count"
,
"name"
:
"num"
}
],
"intervals"
: [
"2016-06-27/2016-06-28"
]
}
-
Sum aggregators
longSum、doubleSum、floatSum
12345678select
page,
sum
(delta)
as
num
from
wikipedia3
where
"__time"
BETWEEN
TIMESTAMP
'2016-06-27 00:00:00'
AND
TIMESTAMP
'2016-06-28 00:00:00'
group
by
page
order
by
page
asc
limit 5
123456789101112131415161718{
"queryType"
:
"topN"
,
"dataSource"
:
"wikipedia3"
,
"dimension"
:
"page"
,
"threshold"
: 5,
"metric"
:
"num"
,
"granularity"
:
"all"
,
"aggregations"
: [
{
"type"
:
"longSum"
,
"name"
:
"num"
,
"fieldName"
:
"delta"
}
],
"intervals"
: [
"2016-06-27/2016-06-28"
]
}
-
Min / Max aggregators
doubleMin、doubleMax、floatMin、floatMax、longMin、longMax
12345678select
page,
max
(delta)
as
num
from
wikipedia3
where
"__time"
BETWEEN
TIMESTAMP
'2016-06-27 00:00:00'
AND
TIMESTAMP
'2016-06-28 00:00:00'
group
by
page
order
by
page
asc
limit 5
123456789101112131415161718{
"queryType"
:
"topN"
,
"dataSource"
:
"wikipedia3"
,
"dimension"
:
"page"
,
"threshold"
: 5,
"metric"
:
"num"
,
"granularity"
:
"all"
,
"aggregations"
: [
{
"type"
:
"longMax"
,
"name"
:
"num"
,
"fieldName"
:
"delta"
}
],
"intervals"
: [
"2016-06-27/2016-06-28"
]
}
-
First / Last aggregator
不能在数据摄入的时候使用,只能用于查询
Last:最大时间戳对应的数据,0 if no row exist;First最小时间戳对应的数据,0 if no row exist
-
JavaScript aggregator
-
-
Post Aggregations
对Aggregations的结果进行二次加工并输出,最终的结果既包含Aggregations的结果也包含Post Aggregations的结果
2. Timeseries
统计一段时间内的汇总数据
1
2
3
4
|
SELECT count (*) as num,
sum (added)
FROM wikipedia
WHERE "__time" BETWEEN TIMESTAMP '2016-06-27 00:00:00' AND TIMESTAMP '2016-06-27 23:59:59'
|
1
2
3
4
5
6
7
8
9
10
|
{ "queryType" : "timeseries" ,
"dataSource" : "wikipedia3" ,
"granularity" : "all" ,
"aggregations" : [
{ "type" : "count" , "name" : "count" },
{ "type" : "longSum" , "name" : "added" , "fieldName" : "added" }
],
"intervals" : [ "2016-06-27/2016-06-28" ]
} |
3. TopN
返回前N条数据,并可以按照metric排序,可以支持维度,但只有一个
1
2
3
4
5
6
7
8
|
SELECT page,
sum (added) as num
FROM wikipedia
WHERE "__time" BETWEEN TIMESTAMP '2016-06-27 00:00:00' AND TIMESTAMP '2016-06-27 23:59:59'
group by page
order by num desc
limit 5 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
{ "queryType" : "topN" ,
"dataSource" : "wikipedia3" ,
"dimension" : "page" ,
"threshold" : 5,
"metric" : "added" ,
"granularity" : "all" ,
"aggregations" : [
{
"type" : "doubleSum" ,
"name" : "added" ,
"fieldName" : "added"
}
],
"intervals" : [ "2016-06-27/2016-06-28" ]
} |
4. GroupBy
能对指定的多个维度分组,也支持对指定的维度排序,也支持limit,但是性能比TopN和Timeseries要差很多
1
2
3
4
5
6
7
8
9
10
|
SELECT page,
countryName,
sum (added) as num,
sum (delta) as num2
FROM wikipedia
WHERE "__time" BETWEEN TIMESTAMP '2016-06-27 00:00:00' AND TIMESTAMP '2016-06-27 23:59:59'
group by page,countryName
order by num desc
limit 5 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
{ "queryType" : "groupBy" ,
"dataSource" : "wikipedia3" ,
"granularity" : "all" ,
"dimensions" : [
"page" ,
"countryName"
],
"limitSpec" : {
"type" : "default" ,
"limit" : 5,
"columns" : [
{
"dimension" : "added" ,
"direction" : "descending" ,
"dimensionOrder" : {
"type" : "numeric"
}
}
]
},
"aggregations" : [
{
"type" : "longSum" ,
"name" : "added" ,
"fieldName" : "added"
},
{
"type" : "longSum" ,
"name" : "delta" ,
"fieldName" : "delta"
}
],
"intervals" : [
"2016-06-27/2016-06-28"
]
} |
5. Search
类似于like操作,可以查询多个维度列,不支持聚合
1
2
3
4
5
6
7
|
SELECT page, countryName FROM wikipedia
WHERE "__time" BETWEEN TIMESTAMP '2016-06-27 00:00:00' AND TIMESTAMP '2016-06-27 23:59:59'
and page like '%C' or countryName like '%C'
limit 5 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
{ "queryType" : "search" ,
"dataSource" : "wikipedia3" ,
"granularity" : "all" ,
"dimensions" : [
"page" ,
"countryName"
],
"query" : {
"type" : "insensitive_contains" ,
"value" : "C"
},
"sort" : {
"type" : "lexicographic"
},
"limit" : 5,
"intervals" : [
"2016-06-27/2016-06-28"
]
} |
6. Select
查数据,不支持聚合,但支持分页,排序
1
2
3
4
5
|
SELECT * FROM wikipedia
WHERE "__time" BETWEEN TIMESTAMP '2016-06-27 00:00:00' AND TIMESTAMP '2016-06-27 23:59:59'
limit 0,5 |
1
2
3
4
5
6
7
8
9
10
11
|
{ "queryType" : "select" ,
"dataSource" : "wikipedia3" ,
"granularity" : "all" ,
"dimensions" :[],
"metrics" :[],
"pagingSpec" :{ "pagingIdentifiers" : {}, "threshold" :5},
"intervals" : [
"2016-06-27/2016-06-28"
]
} |
7. Scan
类似于Select,但不支持分页,但是如果没有分页需求,推荐使用这个,性能比Select好
1
2
3
4
5
|
SELECT page,countryName FROM wikipedia
WHERE "__time" BETWEEN TIMESTAMP '2016-06-27 00:00:00' AND TIMESTAMP '2016-06-27 23:59:59'
limit 5 |
1
2
3
4
5
6
7
8
9
10
11
|
{ "queryType" : "scan" ,
"dataSource" : "wikipedia3" ,
"resultFormat" : "list" ,
"columns" :[ "page" , "countryName" ],
"intervals" : [
"2016-06-27/2016-06-28"
],
"batchSize" :20480,
"limit" :5
}
|
上一篇: 2018新年管理感言
推荐阅读
-
用MVC架构时,如何进行多表联合查询?求一比较优秀的解决方法
-
快速入门:使用Azure 数据 Studio进行连接和查询 Azure SQL 数据库
-
MySql数据库查询多级部门及其下的所有用户信息
-
快速入门:连接和查询 PostgreSQL 使用 Azure 数据 Studio
-
45个非常有用的Oracle查询语句
-
快速入门:使用Azure 数据 Studio进行连接和查询 Azure SQL 数据仓库中的数据
-
Oracle生成查询包含指定字段名对应的所有数据表记录语句
-
求一下总记录数,好分页,但是count(*) 要2秒,查询时间记录结果只要0.0044秒解决思路
-
mysql-求助MySQL的关于sql语句怎么写??三表的查询~~~请大神进来帮忙~~~~~
-
如何查询一块磁盘指定时间内的使用信息