Skip to content

Latest commit

 

History

History
347 lines (265 loc) · 13.2 KB

04.高级搜索.md

File metadata and controls

347 lines (265 loc) · 13.2 KB

高级搜索

1. 背景

Atlas中的高级搜索也称为基于DSL的搜索。

域特定搜索(DSL)是一种具有简单结构的语言,可帮助用户导航Atlas数据存储库。语法松散地模拟来自关系数据库世界的流行结构化查询语言(SQL)。

DSL的好处:

  • 抽象实现级数据库构造。这避免了了解底层图形数据库结构的必要性。
  • 为用户提供了一个抽象,通过了解其数据集中的类型及其关系,帮助他们检索数据。
  • 允许一种指定所需输出的方法。
  • 语法中考虑了分类的使用。
  • 提供分组和汇总结果的方法。
  • 我们将在后面的示例中使用快速启动数据集。该数据集非常全面,可用于演示该语言的各种功能。

有关语法的详细信息,请参阅Github上的Atlas DSL Grammer(Antlr G4格式)。

1.1 使用高级搜索

在Atlas UI中,在左侧的“Search”窗格中选择“Advanced”。

请注意“Search By Query ”框下方的“Favorite Searches”窗格。与基本搜索一样,也可以保存高级搜索。

2. 领域特定语言简介

DSL使用熟悉的类SQL语法。

高级别查询具有from-where-select格式。可以使用诸如grouby,orderby,limit之类的附加关键字来添加以影响输出。我们将在下面看到这些例子。

2.1 From语句

指定from是必需语句。使用from关键字本身是可选的。 from语句中指定的值充当查询其余部分的源或起点,以获取其输入。

示例:要检索DB类型的所有实体:

DB
from DB

如果没有对where进行过滤,则from语句提取的数据集就是数据库中的所有内容。根据数据库中存在的数据大小,可能会使服务器瘫痪。因此,查询处理器添加了具有默认值集的limit语句。有关详细信息,请参阅limit语句部分。

2.2 Where语句

where语句允许对数据集进行过滤。这是通过在where语句中使用条件实现的。

条件是标识符,后跟运算符后跟文字。文字必须用单引号或双引号括起来。例如,name =“Sales”。标识符可以是from语句中指定的类型的属性的名称或别名。

示例:要检索一个名为time_dim的Table类型的实体:

from Table where name = 'time_dim'

通过使用and,or运算符组合它们可以指定多个条件。

示例:要检索名为time_dim或customer_dim的Table类型实体:

from Table where name = 'time_dim' or name = 'customer_dim'

通过指定方括号中的值,可以使用基于值列表的过滤来完成。值数组是括在方括号内的值列表。这是在标识符上指定OR语句的简单方法。

请注意,在同一属性上使用多个OR语句可能效率低下。替代方法是使用值数组,如下例所示。

示例:上面示例中的查询可以使用值数组编写,如下所示。

from Table where name = ["customer_dim", "time_dim"]

也可以使用其他形式的正则表达式。

示例:要检索名称以R开头,后跟有3个字符的数据库,后跟rt,后跟至少1个字符,后不跟或跟任意数量的字符。

DB where name like "R???rt?*"

2.1.1 使用日期文字

文字中使用的日期需要使用ISO 8601格式指定。

此格式的日期遵循以下表示法:

  • YYYY-MM-DDTHH:MM:ss.SSSZ。这意味着,年-月-日,然后是小时-分-秒-毫秒。日期和时间需要用T分隔。它应以Z结尾。
  • YYYY-MM-DD这意味着,年-月-日

示例:日期表示2017年12月11日凌晨2:35。

2017-12-11T02:35:0.0Z

示例:检索2017年和2018年创建的Table类型的实体。

from Table where createTime < '2018-01-01' and createTime > '2017-01-01'

2.1.2 使用布尔文字

boolean类型的实体的属性可以在查询中使用。

示例:检索hdfs_path类型的实体,其属性isFile设置为true且名称为

from hdfs_path where isFile = true or name = "Invoice"

布尔文字的有效值为“true”和“false”。

2.2 属性检查

has关键字可以与where语句一起使用或不与where语句一起使用。它用于检查实体中是否存在属性。

示例:使用属性locationUri检索Table类型的实体。

Table has locationUri
from Table where Table has locationUri

2.3 Select语句

如果您注意到网页上显示的输出,则会显示为一个表格形式,每行对应一个实体,列是该实体的属性。 select语句允许选择感兴趣的实体属性。

示例:要检索具有少量属性的Table类型的实体:

from Table select owner, name, qualifiedName

示例:为具有某些属性的特定表检索Table类型的实体。

from Table where name = 'customer_dim' select owner, name, qualifiedName

要显示更有意义的列标题,可以使用“as”语句添加别名。

示例:将列标题显示为“Owner”,“Name”和“FullName”。

from Table select owner as Owner, name as Name, qualifiedName as FullName

2.3.1 关于选择语句的注意事项

鉴于使用select语句涉及的复杂性,这些是使用select语句时要记住的几个规则:

  • 适用于所有直接属性。
  • 适用于直接属性的直接属性和聚合。
  • 引用的属性不能与直接属性混合使用。

示例:要检索名为“Sales”的Table类型的实体,并显示引用实体DB的“name”和“owner”属性。

Table where name = 'abcd' select DB.name, DB.owner

目前不允许以下的格式:

Table where name = 'abcd' select DB.name, Table.name

2.4 基于分类的过滤

为了基于分类检索实体,查询将使用isisa关键字。

示例:要检索使用Dimension分类标记的所有Table类型的实体。

from Table isa Dimension

因为from是可选的并且和is(或isa)是等价的,所以以下查询产生相同的结果:

Table is Dimension

isisa语句也可用于where里面:

from Table where Table isa Dimension

要搜索具有特定分类的所有实体,只需使用分类的名称。

示例:检索具有Dimension分类的所有实体。

Dimension

2.5 Limit & Offset语句

查询通常会产生大量结果。要限制查询的结果,请使用limitoffset语句。

示例:仅从结果集中检索5个实体。

Column limit 5

offset语句在偏移值之后检索结果。

示例:在跳过前10个结果集后,仅从结果集中检索5个实体。

Column limit 5 offset 10

limitoffset语句通常一起指定。

如果在查询中未指定limit语句,则会向查询添加具有默认限制(通常为100)的limit语句。这可以防止查询无意中获取大量结果。

offset语句对于在用户界面中显示结果很有用,其中显示结果集的结果很少,并且随着用户前进到下一页而获取更多结果。

2.6 结果排序

orderby语句允许对结果进行排序。默认情况下,结果按升序排序。在此语句中只能使用直接属性。

排序可以通过以下方式更改:

  • ASC按升序排序。这是默认值。如果在orderby语句后没有指定排序。
  • DESC按降序排序。这需要在orderby语句之后显式指定。

示例:要检索使用name属性按升序排序的Column类型的实体。

from Column orderby name
from Column orderby name asc

示例:与上面的结果相同,只是它们按降序排序。

from Column orderby name desc

2.7 聚合函数

我们来看看聚合函数:

  • sum:在结果集中添加(总结)指定属性的值。
  • min:在结果集中查找指定属性的最小值。
  • max:在结果集中查找指定属性的最大值。
  • count:查找group by语句指定的项目数。 这些只适用于直接属性。

“分组结果”部分中的其他示例。

2.7.1 count关键字

显示结果集中的条目数。

示例:获取实体的数量。

Column select count()

示例:与上面的别名相同。

Column select count() as Cols

示例:查找数据库中表的数目。

Table where db.name = "Reporting" select count()

2.7.2 max关键字

使用此关键字可以检索实体的属性的最大值。

示例:获取Table实体的createTime属性的最近创建的值。

Table select min(createTime)

2.8 结果分组

groupby语句使用指定的属性对结果中的结果进行分组。

示例:检索Table类型的实体,使属于所有者的表一起(按所有者分组)。

Table groupby(owner)

虽然groupby可以在没有select的情况下工作,但如果在select语句中使用聚合函数,则必需使用groupby语句,因为聚合函数在一个组上运行。

示例:检索Table类型最近创建的实体。

Table groupby(createTime) select owner, name, max(createTime)

示例:获取每个所有者拥有的实体数量。

Table groupby(owner) select owner, count()

2.9 复杂类型Where语句

在到目前为止的讨论中,我们查看了带有原始类型的语句。本节将介绍如何使用非基本类型的属性。

在此模型中,对DB进行建模,使其知道它包含的所有表。另一方面,表知道DB的存在,但不知道系统中的所有其他Table实例。每个表都维护它所属的DB的引用。

hive数据模型中存在类似的结构。

示例:要检索属于名为“Sales”的数据库的表的所有实例:

Table where db.name = "Sales"

实体Column以类似的方式建模。每个Table实体的外边缘指向对应于表中每列的Column实体实例。

示例:检索给定表的所有Column实体。

Table where name = "time_dim" select columns

显示每个Column实体类型的属性。

2.10 使用系统属性

Atlas中定义的每种类型默认情况下都会有一些属性。所有系统属性都以“__”为前缀(双下划线)。这有助于从其他属性中识别它们。

以下是系统属性:

  • __guid Atlas中的每个实体都分配了一个全局唯一标识符(简称GUID)。
  • __modifiedBy上次修改实体的用户的名称。
  • __createdBy创建实体的用户的名称。
  • __state实体的当前状态。请参阅下面的详细信息。
  • __timestamp创建时实体的时间戳(表示为整数的日期)。
  • __modificationTimestamp上次修改时实体的时间戳(以整数表示的日期)。

2.10.1 实体状态

Atlas中的实体可以处于以下状态:

  • ACTIVE这是实体当它可用并在系统中使用时的状态,。默认情况下,搜索使用这种状态检索。
  • DELETED删除实体时,其状态标记为DELETED。处于此状态的实体不会显示在搜索结果中。需要显式请求来检索此实体。

2.10.2 在查询中使用系统属性

示例:检索已删除的所有实体。

Asset where __state = "DELETED"

示例:检索实体GUID。

Table select __guid

示例:检索多个系统属性。

hive_db select __timestamp, __modificationTimestamp, __state, __createdBy

3. 高级搜索REST API

这些操作的相关模型:

3.1 The V2 API

使用DSL搜索获得结果

Get Results using DSL Search

示例

curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?typeName=Table"
curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?typeName=Column&classification=PII"
curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?typeName=Table&classification=Dimension&limit=10&offset=2"
curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?query=Table%20isa%20Dimension"
curl -X GET -u admin:admin -H "Content-Type: application/json" "http://localhost:21000/api/atlas/v2/search/dsl?query=Table%20isa%20Dimension&limit=5&offset=2"

4. 实施方法

在Atlas中实现DSL的一般方法可以通过以下步骤进行枚举:

  • 解析器解析传入的查询以获取语法(syntax)。
  • 对于成功解析的查询,生成抽象语法树。
  • 语法树是使用访问者模式'walked'。
  • 树中的每次“visit”都会在Gremlin管道中增加一步。
  • 完成后,使用Gremlin Script Engine执行生成的脚本。
  • 生成的结果是查询(如果有),在AtlasSearchResult结构中处理和打包。

5. 主版本和早期版本之间的差异

不再支持以下语句:

  • path
  • loop

6. 资源