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 = cityName123456789101112131415161718192021222324{"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
12345678selectpage,count(*)asnumfromwikipedia3where"__time"BETWEENTIMESTAMP'2016-06-27 00:00:00'ANDTIMESTAMP'2016-06-28 00:00:00'groupbypageorderbynumdesclimit 51234567891011121314151617{"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
12345678selectpage,sum(delta)asnumfromwikipedia3where"__time"BETWEENTIMESTAMP'2016-06-27 00:00:00'ANDTIMESTAMP'2016-06-28 00:00:00'groupbypageorderbypageasclimit 5123456789101112131415161718{"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
12345678selectpage,max(delta)asnumfromwikipedia3where"__time"BETWEENTIMESTAMP'2016-06-27 00:00:00'ANDTIMESTAMP'2016-06-28 00:00:00'groupbypageorderbypageasclimit 5123456789101112131415161718{"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
|
SELECTpage,countryNameFROM 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
|
SELECTpage,countryNameFROM 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
}
|
1万+

被折叠的 条评论
为什么被折叠?



