Atlas中的高级搜索也称为基于DSL的搜索。
域特定搜索(DSL)是一种具有简单结构的语言,可帮助用户导航Atlas数据存储库。语法松散地模拟来自关系数据库世界的流行结构化查询语言(SQL)。
DSL的好处:
- 抽象实现级数据库构造。这避免了了解底层图形数据库结构的必要性。
- 为用户提供了一个抽象,通过了解其数据集中的类型及其关系,帮助他们检索数据。
- 允许一种指定所需输出的方法。
- 语法中考虑了分类的使用。
- 提供分组和汇总结果的方法。
- 我们将在后面的示例中使用快速启动数据集。该数据集非常全面,可用于演示该语言的各种功能。
有关语法的详细信息,请参阅Github上的Atlas DSL Grammer(Antlr G4格式)。
在Atlas UI中,在左侧的“Search”窗格中选择“Advanced”。
请注意“Search By Query ”框下方的“Favorite Searches”窗格。与基本搜索一样,也可以保存高级搜索。
DSL使用熟悉的类SQL语法。
高级别查询具有from-where-select格式。可以使用诸如grouby,orderby,limit之类的附加关键字来添加以影响输出。我们将在下面看到这些例子。
指定from是必需语句。使用from关键字本身是可选的。 from语句中指定的值充当查询其余部分的源或起点,以获取其输入。
示例:要检索DB类型的所有实体:
DB
from DB
如果没有对where进行过滤,则from语句提取的数据集就是数据库中的所有内容。根据数据库中存在的数据大小,可能会使服务器瘫痪。因此,查询处理器添加了具有默认值集的limit语句。有关详细信息,请参阅limit语句部分。
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?*"
文字中使用的日期需要使用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'
boolean类型的实体的属性可以在查询中使用。
示例:检索hdfs_path类型的实体,其属性isFile设置为true且名称为
from hdfs_path where isFile = true or name = "Invoice"
布尔文字的有效值为“true”和“false”。
has关键字可以与where语句一起使用或不与where语句一起使用。它用于检查实体中是否存在属性。
示例:使用属性locationUri检索Table类型的实体。
Table has locationUri
from Table where Table has locationUri
如果您注意到网页上显示的输出,则会显示为一个表格形式,每行对应一个实体,列是该实体的属性。 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
鉴于使用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
为了基于分类检索实体,查询将使用is
或isa
关键字。
示例:要检索使用Dimension
分类标记的所有Table类型的实体。
from Table isa Dimension
因为from
是可选的并且和is
(或isa
)是等价的,所以以下查询产生相同的结果:
Table is Dimension
is
和isa
语句也可用于where
里面:
from Table where Table isa Dimension
要搜索具有特定分类的所有实体,只需使用分类的名称。
示例:检索具有Dimension
分类的所有实体。
Dimension
查询通常会产生大量结果。要限制查询的结果,请使用limit
和offset
语句。
示例:仅从结果集中检索5个实体。
Column limit 5
offset语句在偏移值之后检索结果。
示例:在跳过前10个结果集后,仅从结果集中检索5个实体。
Column limit 5 offset 10
limit
和offset
语句通常一起指定。
如果在查询中未指定limit
语句,则会向查询添加具有默认限制(通常为100)的limit
语句。这可以防止查询无意中获取大量结果。
offse
t语句对于在用户界面中显示结果很有用,其中显示结果集的结果很少,并且随着用户前进到下一页而获取更多结果。
orderby
语句允许对结果进行排序。默认情况下,结果按升序排序。在此语句中只能使用直接属性。
排序可以通过以下方式更改:
ASC
按升序排序。这是默认值。如果在orderby
语句后没有指定排序。DESC
按降序排序。这需要在orderby
语句之后显式指定。
示例:要检索使用name属性按升序排序的Column类型的实体。
from Column orderby name
from Column orderby name asc
示例:与上面的结果相同,只是它们按降序排序。
from Column orderby name desc
我们来看看聚合函数:
sum
:在结果集中添加(总结)指定属性的值。min
:在结果集中查找指定属性的最小值。max
:在结果集中查找指定属性的最大值。count
:查找group by语句指定的项目数。 这些只适用于直接属性。
“分组结果”部分中的其他示例。
显示结果集中的条目数。
示例:获取实体的数量。
Column select count()
示例:与上面的别名相同。
Column select count() as Cols
示例:查找数据库中表的数目。
Table where db.name = "Reporting" select count()
使用此关键字可以检索实体的属性的最大值。
示例:获取Table实体的createTime属性的最近创建的值。
Table select min(createTime)
groupby
语句使用指定的属性对结果中的结果进行分组。
示例:检索Table类型的实体,使属于所有者的表一起(按所有者分组)。
Table groupby(owner)
虽然groupby
可以在没有select
的情况下工作,但如果在select
语句中使用聚合函数,则必需使用groupby语句,因为聚合函数在一个组上运行。
示例:检索Table类型最近创建的实体。
Table groupby(createTime) select owner, name, max(createTime)
示例:获取每个所有者拥有的实体数量。
Table groupby(owner) select owner, count()
在到目前为止的讨论中,我们查看了带有原始类型的语句。本节将介绍如何使用非基本类型的属性。
在此模型中,对DB进行建模,使其知道它包含的所有表。另一方面,表知道DB的存在,但不知道系统中的所有其他Table实例。每个表都维护它所属的DB的引用。
hive数据模型中存在类似的结构。
示例:要检索属于名为“Sales”的数据库的表的所有实例:
Table where db.name = "Sales"
实体Column以类似的方式建模。每个Table实体的外边缘指向对应于表中每列的Column实体实例。
示例:检索给定表的所有Column实体。
Table where name = "time_dim" select columns
显示每个Column实体类型的属性。
Atlas中定义的每种类型默认情况下都会有一些属性。所有系统属性都以“__”为前缀(双下划线)。这有助于从其他属性中识别它们。
以下是系统属性:
__guid Atlas
中的每个实体都分配了一个全局唯一标识符(简称GUID)。__modifiedBy
上次修改实体的用户的名称。__createdBy
创建实体的用户的名称。__state
实体的当前状态。请参阅下面的详细信息。__timestamp
创建时实体的时间戳(表示为整数的日期)。__modificationTimestamp
上次修改时实体的时间戳(以整数表示的日期)。
Atlas中的实体可以处于以下状态:
ACTIVE
这是实体当它可用并在系统中使用时的状态,。默认情况下,搜索使用这种状态检索。DELETED
删除实体时,其状态标记为DELETED。处于此状态的实体不会显示在搜索结果中。需要显式请求来检索此实体。
示例:检索已删除的所有实体。
Asset where __state = "DELETED"
示例:检索实体GUID。
Table select __guid
示例:检索多个系统属性。
hive_db select __timestamp, __modificationTimestamp, __state, __createdBy
这些操作的相关模型:
示例
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"
在Atlas中实现DSL的一般方法可以通过以下步骤进行枚举:
- 解析器解析传入的查询以获取语法(syntax)。
- 对于成功解析的查询,生成抽象语法树。
- 语法树是使用访问者模式'walked'。
- 树中的每次“visit”都会在Gremlin管道中增加一步。
- 完成后,使用Gremlin Script Engine执行生成的脚本。
- 生成的结果是查询(如果有),在AtlasSearchResult结构中处理和打包。
不再支持以下语句:
- path
- loop
- Antlr Book。
- Antlr快速入门。
- Github上的Atlas DSL语法(Antlr G4格式)。