From c38baf1e8848c209764fb92652d24079156589a1 Mon Sep 17 00:00:00 2001 From: liujianhuan Date: Mon, 18 Jan 2021 15:05:57 +0800 Subject: [PATCH] add filter part-1 --- Misc/learning.md | 8 +- Misc/optimized.md | 8 +- Querying/filters.md | 252 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 265 insertions(+), 3 deletions(-) diff --git a/Misc/learning.md b/Misc/learning.md index 3441fd0..0d290b7 100644 --- a/Misc/learning.md +++ b/Misc/learning.md @@ -10,4 +10,10 @@ Apache Druid虽然尚未在各个企业绝对普及,但是在互联网大厂是得到了较多应用的,毕竟它出道时间不长,还算作是新技术呢,而对于新技术,互联网一线大厂往往是践行者。 - [原文链接](https://www.bilibili.com/read/cv8594505) \ No newline at end of file + [原文链接](https://www.bilibili.com/read/cv8594505) + +3. [Kylin、Druid、ClickHouse核心技术对比](https://zhuanlan.zhihu.com/p/267311457) + + Druid索引结构使用自定义的数据结构,整体上它是一种列式存储结构,每个列独立一个逻辑文件(实际上是一个物理文件,在物理文件内部标记了每个列的start和offset) + + [原文链接](https://zhuanlan.zhihu.com/p/267311457) \ No newline at end of file diff --git a/Misc/optimized.md b/Misc/optimized.md index 28151df..8569cbd 100644 --- a/Misc/optimized.md +++ b/Misc/optimized.md @@ -27,4 +27,10 @@ 有赞作为一家 SaaS 公司,有很多的业务的场景和非常大量的实时数据和离线数据。在没有是使用 Druid 之前,一些 OLAP 场景的场景分析,开发的同学都是使用 SparkStreaming 或者 Storm 做的。用这类方案会除了需要写实时任务之外,还需要为了查询精心设计存储。带来问题是:开发的周期长;初期的存储设计很难满足需求的迭代发展;不可扩展。 - [原文链接](https://www.cnblogs.com/oldtrafford/p/10301581.html) \ No newline at end of file + [原文链接](https://www.cnblogs.com/oldtrafford/p/10301581.html) + +6. [Druid 在小米公司的技术实践](https://zhuanlan.zhihu.com/p/25593670) + + Druid 作为一款开源的实时大数据分析软件,自诞生以来,凭借着自己优秀的特质,逐渐在技术圈收获了越来越多的知名度与口碑,并陆续成为了很多技术团队解决方案中的关键一环,从而真正在很多公司的技术栈中赢得了一席之地。 + [原文链接](https://zhuanlan.zhihu.com/p/25593670) + diff --git a/Querying/filters.md b/Querying/filters.md index 1eef3b8..8fdd72f 100644 --- a/Querying/filters.md +++ b/Querying/filters.md @@ -1 +1,251 @@ - \ No newline at end of file + + + + + + +## 查询过滤器(Query Filters) + +> [!WARNING] +> Apache Druid支持两种查询语言: [Druid SQL](druidsql.md) 和 [原生查询](makeNativeQueries.md)。该文档描述了原生查询中的一种查询方式。 对于Druid SQL中使用的该种类型的信息,可以参考 [SQL文档](druidsql.md)。 + +Filter是一个JSON对象,指示查询的计算中应该包含哪些数据行。它本质上相当于SQL中的WHERE子句。Apache Druid支持以下类型的过滤器。 + +**注意** + +过滤器通常情况下应用于维度列,但是也可以使用在聚合后的指标上,例如,参见 [filtered-aggregator](Aggregations.md#过滤聚合器) 和 [having-filter](having.md) + +### **选择过滤器(Selector Filter)** + +最简单的过滤器就是选择过滤器。 选择过滤器使用一个特定的值来匹配一个特定的维度。 选择过滤器可以被用来当做更复杂的布尔表示式过滤器的基础过滤器。 + +选择过滤器的语法如下: + +```json +"filter": { "type": "selector", "dimension": , "value": } +``` + +该表达式等价于 `WHERE = ''` + +选择过滤器支持使用提取函数,详情可见 [带提取函数的过滤器](#带提取函数的过滤器) + +### **列比较过滤器(Column Comparison Filter)** + +列比较过滤器与选择过滤器很相似,不同的是比较的不同的维度。例如: + +```json +"filter": { "type": "columnComparison", "dimensions": [, ] } +``` +该表达式等价于 `WHERE = ` + +`dimensions` 为 [DimensionSpecs](dimensionspec.md)中的list, 需要的话还可以使用提取函数。 + +### **正则表达式过滤器(Regular expression Filter)** + +正则表达式过滤器与选择过滤器相似,不同的是使用正则表达式。 它使用一个给定的模式来匹配特性的维度。 模式可以是任意的标准 [Java正则表达式](https://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html) + +```json +"filter": { "type": "regex", "dimension": , "pattern": } +``` + +正则表达式支持使用提取函数,详情可见 [带提取函数的过滤器](#带提取函数的过滤器) + +### **逻辑表达式过滤器(Logical expression Filter)** + +**AND** + +AND过滤器的语法如下: + +```json +"filter": { "type": "and", "fields": [, , ...] } +``` + +该过滤器的fields字段中可以是本页中的任何一个过滤器 + +**OR** + +OR过滤器的语法如下: + +```json +"filter": { "type": "or", "fields": [, , ...] } +``` + +该过滤器的fields字段中可以是本页中的任何一个过滤器 + +**NOT** + +NOT过滤器的语法如下: + +```json +"filter": { "type": "not", "field": } +``` + +该过滤器的field字段中可以是本页中的任何一个过滤器 + +### **JavaScript过滤器** + +JavaScript过滤器使用一个特定的js函数来匹配维度。 该过滤器匹配到函数返回为true的值。 + +JavaScript函数需要一个维度值的参数,返回值要么是true或者false + +```json +{ + "type" : "javascript", + "dimension" : , + "function" : "function(value) { <...> }" +} +``` + +例如, 下边的表达式将匹配维度 `name` 在 `bar` 和 `foo` 之间的维度值。 + +```json +{ + "type" : "javascript", + "dimension" : "name", + "function" : "function(x) { return(x >= 'bar' && x <= 'foo') }" +} +``` + +JavaScript过滤器支持使用提取函数,详情可见 [带提取函数的过滤器](#带提取函数的过滤器) + +> [!WARNING] +> 基于JavaScript的功能默认是禁用的。 如何启用它以及如何使用Druid JavaScript功能,参考 [JavaScript编程指南](../Development/JavaScript.md)。 + +### **提取过滤器(Extraction Filter)** + +> [!WARNING] +> 提取过滤器当前已经废弃。 指定了提取函数的选择器过滤器提供了相同的功能,应该改用它。 + +提取过滤器使用一个特定的 [提取函数](dimensionspec.md) 来匹配维度。 以下筛选器匹配提取函数具有转换条目`input_key=output_value`的值,其中`output_value`等于过滤器`value`,`input_key`作为维度显示。 + +例如, 下列例子匹配 `product` 列中维度值为 `[product_1, product_3, product_5]`的数据: + +```json +{ + "filter": { + "type": "extraction", + "dimension": "product", + "value": "bar_1", + "extractionFn": { + "type": "lookup", + "lookup": { + "type": "map", + "map": { + "product_1": "bar_1", + "product_5": "bar_1", + "product_3": "bar_1" + } + } + } + } +} +``` + +### **搜索过滤器(Search Filter)** + +搜索过滤器可以使用在部分字符串上进行过滤匹配 + +```json +{ + "filter": { + "type": "search", + "dimension": "product", + "query": { + "type": "insensitive_contains", + "value": "foo" + } + } +} +``` + +| 属性 | 描述 | 是否必须 | +|-|-|-| +| `type` | 该值始终为`search` | 是 | +| `dimension` | 要执行搜索的维度 | 是 | +| `query` | 搜索类型的详细JSON对象。 详情可看下边 | 是 | +| `extractionFn` | 对维度使用的 [提取函数](dimensionspec.md) | 否 | + +搜索过滤器支持使用提取函数,详情可见 [带提取函数的过滤器](#带提取函数的过滤器) + +**搜索查询规格** + +*Contains* + +| 属性 | 描述 | 是否必须 | +|-|-|-| +| `type` | 该值始终为`contains` | 是 | +| `value` | 要执行搜索的字符串值 | 是 | +| `caseSensitive` | 两个字符串比较时是否忽略大小写 | 否(默认为false) | + +*Insensitive Contains* + +| 属性 | 描述 | 是否必须 | +|-|-|-| +| `type` | 该值始终为`insensitive_contains` | 是 | +| `value` | 要执行搜索的字符串值 | 是 | + +注意:一个"insensitive_contains"搜索等价于一个具有值为false或者未提供的"caseSensitive"的"contains"搜索 + +*Fragment* + +| 属性 | 描述 | 是否必须 | +|-|-|-| +| `type` | 该值始终为`fragment` | 是 | +| `values` | 要执行搜索的字符串值数组 | 是 | +| `caseSensitive` | 两个字符串比较时是否忽略大小写 | 否(默认为false) | + +### **In过滤器** + +In过滤器可以用来表达以下SQL查询: + +```sql + SELECT COUNT(*) AS 'Count' FROM `table` WHERE `outlaw` IN ('Good', 'Bad', 'Ugly') + ``` + + In过滤器的语法如下: + + ```json + { + "type": "in", + "dimension": "outlaw", + "values": ["Good", "Bad", "Ugly"] +} +``` + +In过滤器支持使用提取函数,详情可见 [带提取函数的过滤器](#带提取函数的过滤器) + +如果一个空的`values`传给了In过滤器,则简单的返回一个空的结果。 如果 `dimension`为多值维度,则当维度中的一个值在 `values`数组中时In过滤器将返回true + +### **Like过滤器** + +Like过滤器被用于基本的通配符搜索,等价于SQL中的LIKE语句。 特定的符号支持"%"(匹配任意数量的字符)和"_"(匹配任意单个字符) + +| 属性 | 类型 | 描述 | 是否必须 | +|-|-|-|-| +| `type` | String | 该值始终为`fragment` | 是 | +| `dimension` | String | 需要过滤的维度 | 是 | +| `pattern` | String | LIKE模式, 例如"foo%"或者"__bar" | 是 | +| `escape` | String | 可以用来转义特殊字符的转义符号 | 否 | +| `extractionFn` | [提取函数](dimensionspec.md) | 对维度使用的 [提取函数](dimensionspec.md) | 否 | + +Like过滤器支持使用提取函数,详情可见 [带提取函数的过滤器](#带提取函数的过滤器) + +下边的Like过滤器表达了条件 `last_name LIKE "D%"`, 即: last_name以D开头 + +```json +{ + "type": "like", + "dimension": "last_name", + "pattern": "D%" +} +``` + +#### **带提取函数的过滤器** +