Создание и получение связей с помощью REST API
В этом руководстве описано, как использовать REST API Purview для выполнения:
- Создание ресурсов и связей происхождения между ресурсами данных.
- Связи и пути происхождения запросов.
API, на которые ссылается эта статья:
Предварительные условия
Для использования этих API требуются роли куратора данных и читателя данных. Дополнительные сведения о получении маркера доступа см. в этом руководстве .
Концепции
Актив
В Purview у нас есть два типа базовых ресурсов: DataSet и Process.
- Ресурсы набора данных, содержащие такие данные, как Azure SQL table, Oracle Table и т. д., должны наследоваться от DataSet.
- Ресурсы обработки, обрабатывающие данные, такие как конвейер данных, запрос, функция и т. д., должны наследоваться от Process.
Ознакомьтесь с ресурсами и типами , чтобы понять определения типов наборов данных и процессов.
Связи & происхождения
В Microsoft Purview мы определяем три типа связей для происхождения:
- dataset_process_inputs: подключает DataSet к процессу, что означает, что набор данных является входными данными процесса.
- process_dataset_outputs: подключает Process к DataSet, что означает, что процесс создает набор данных.
- direct_lineage_dataset_dataset: подключает DataSet1 к DataSet2, что означает, что DataSet1 является вышестоящий DataSet2, хотя мы не знаем точно, какой процесс находится между ними.
Пример 1.Ниже приведен пример происхождения данных с двумя наборами данных, одним процессом и двумя связями происхождения:
Набор данных ---> dataset_process_inputs ---> ---> process_dataset_outputs ---> DataSet
Пример 2.Еще один пример происхождения с 2 наборами данных и одним отношением происхождения:
Набор данных ---> direct_lineage_dataset_dataset ---> DataSet
Создание ресурсов и связей происхождения между ресурсами данных
В следующих разделах давайте рассмотрим hive_table в качестве примера типа для DataSet, а hive_query_process в качестве примера типа для Process. Мы создадим ресурсы с этими двумя типами и создадим между ними линии происхождения. Для создания происхождения можно использовать любой другой тип, наследуемый от DataSet или Process.
Пример 1
Создание ресурсов с помощью API
Если ресурсы, для которых вы хотите создать происхождение, еще не созданы в Microsoft Purview, можно вызвать следующий API, чтобы создать их.
API: массовое создание ресурсов
Задача. Создайте два hive_tables в виде наборов данных — table1 и table2, каждый из которых содержит 2 hive_columns — column1 и column2.
POST {endpoint}/datamap/api/atlas/v2/entity/bulk
С текстом:
{
"entities": [
{
"typeName": "hive_table",
"attributes": {
"qualifiedName": "test_lineage.table1",
"name": "table1"
},
"relationshipAttributes": {
"columns": [
{
"guid": "-11",
"typeName": "hive_column"
},{
"guid": "-12",
"typeName": "hive_column"
}
]
},
"guid": "-1"
},
{
"typeName": "hive_column",
"attributes": {
"qualifiedName": "test_lineage.table1#column1",
"name": "column1",
"type": "int"
},
"guid": "-11",
"relationshipAttributes": {
"table": {
"guid": "-1",
"typeName": "hive_table"
}
}
},
{
"typeName": "hive_column",
"attributes": {
"qualifiedName": "test_lineage.table1#column2",
"name": "column2",
"type": "int"
},
"guid": "-12",
"relationshipAttributes": {
"table": {
"guid": "-1",
"typeName": "hive_table"
}
}
},
{
"typeName": "hive_table",
"attributes": {
"qualifiedName": "test_lineage.table2",
"name": "table2"
},
"relationshipAttributes": {
"columns": [
{
"guid": "-21",
"typeName": "hive_column"
},{
"guid": "-22",
"typeName": "hive_column"
}
]
},
"guid": "-2"
},
{
"typeName": "hive_column",
"attributes": {
"qualifiedName": "test_lineage.table2#column1",
"name": "column1",
"type": "int"
},
"guid": "-21",
"relationshipAttributes": {
"table": {
"guid": "-2",
"typeName": "hive_table"
}
}
},
{
"typeName": "hive_column",
"attributes": {
"qualifiedName": "test_lineage.table2#column2",
"name": "column2",
"type": "int"
},
"guid": "-22",
"relationshipAttributes": {
"table": {
"guid": "-2",
"typeName": "hive_table"
}
}
}
]
}
Задача. Создание ресурса процесса "hive_view_query"
POST {endpoint}/datamap/api/atlas/v2/entity/bulk
С текстом:
{
"entities": [
{
"typeName": "hive_view_query",
"attributes": {
"qualifiedName": "test_lineage.HiveQuery1",
"name": "HiveQuery1",
"columnMapping": "[{\"DatasetMapping\":{\"Source\":\"test_lineage.table1\",\"Sink\":\"test_lineage.table2\"},\"ColumnMapping\":[{\"Source\":\"column1\",\"Sink\":\"column1\"},{\"Source\":\"column2\",\"Sink\":\"column2\"}]}]"
},
"guid": "-1"
}
]
}
Приведенные выше вызовы API приводят к созданию двух hive_tables(Наборы данных) и одного hive_view_query(Process).
Создание связей происхождения между наборами данных и процессом
API: создание связи
Задача. Создание происхождения данных из таблицы 1 —> HiveQuery1 (то есть набора данных —> Процесс)
POST {endpoint}/datamap/api/atlas/v2/relationship
С текстом:
{
"typeName": "dataset_process_inputs",
"guid": "-1",
"end1": {
"typeName": "hive_table",
"uniqueAttributes": {
"qualifiedName": "test_lineage.table1"
}
},
"end2": {
"typeName": "Process",
"uniqueAttributes": {
"qualifiedName": "test_lineage.HiveQuery1"
}
}
}
Задача. Создание происхождения из HiveQuery1 -> table2 (то есть Process -> Dataset)
POST {endpoint}/datamap/api/atlas/v2/relationship
С текстом:
{
"typeName": "process_dataset_outputs",
"guid": "-2",
"end1": {
"typeName": "Process",
"uniqueAttributes": {
"qualifiedName": "test_lineage.HiveQuery1"
}
},
"end2": {
"typeName": "hive_table",
"uniqueAttributes": {
"qualifiedName": "test_lineage.table2"
}
}
}
Просмотр происхождения
После создания ресурсов и связей происхождения можно проверка граф происхождения в Microsoft Purview:
Пример 2
Создание таблицы hive table3 с двумя столбцами
API: массовое создание ресурсов
Задача. Создание таблицы 3 с 2 hive_columns, столбцами 1 и столбцами 2
POST {endpoint}/datamap/api/atlas/v2/entity/bulk
С текстом:
{
"entities": [
{
"typeName": "hive_table",
"attributes": {
"qualifiedName": "test_lineage.table3",
"name": "table3"
},
"relationshipAttributes": {
"columns": [
{
"guid": "-31",
"typeName": "hive_column"
},{
"guid": "-32",
"typeName": "hive_column"
}
]
},
"guid": "-3"
},
{
"typeName": "hive_column",
"attributes": {
"qualifiedName": "test_lineage.table3#column1",
"name": "column1",
"type": "int"
},
"guid": "-31",
"relationshipAttributes": {
"table": {
"guid": "-3",
"typeName": "hive_table"
}
}
},
{
"typeName": "hive_column",
"attributes": {
"qualifiedName": "test_lineage.table3#column2",
"name": "column2",
"type": "int"
},
"guid": "-32",
"relationshipAttributes": {
"table": {
"guid": "-3",
"typeName": "hive_table"
}
}
}
]
}
Создание прямой линии происхождения между таблицами 2 и 3 с сопоставлением столбцов
API: создание связи
Задача. Создание происхождения данных из таблицы 2 —> таблица3 (то есть набор данных —> набор данных) с сопоставлением столбцов
POST {endpoint}/datamap/api/atlas/v2/relationship
С текстом:
{
"typeName": "direct_lineage_dataset_dataset",
"guid": "-1",
"end1": {
"typeName": "hive_table",
"uniqueAttributes": {
"qualifiedName": "test_lineage.table2"
}
},
"end2": {
"typeName": " hive_table ",
"uniqueAttributes": {
"qualifiedName": "test_lineage.table3"
}
},
"attributes": {
"columnMapping": "[{\"Source\":\"column1\",\"Sink\":\"column1\"},{\"Source\":\"column2\",\"Sink\":\"column2\"}]"
}
}
Просмотр происхождения
Теперь граф происхождения (вместе с примером 1 & примером 2 выше) станет следующим:
Обратите внимание, что таблица table2 напрямую связана с table3 без hiveQuery между ними.
Связи и пути происхождения запросов
API: получение происхождения по GUID
Задача. Получение происхождения данных table2 с помощью REST API
GET {{endpoint}}/api/atlas/v2/lineage/{{guid_of_table2}}?direction=BOTH
Ниже приведены полезные данные ответа JSON:
{
"baseEntityGuid": "2a12b3ff-5816-4222-833a-035bf82e06e0",
"lineageDirection": "BOTH",
"lineageDepth": 3,
"lineageWidth": -1,
"childrenCount": -1,
"guidEntityMap": {
"16b93b78-8683-4f88-9651-24c4a9d797b0": {
"typeName": "hive_table",
"attributes": {
"temporary": false,
"lastAccessTime": 0,
"createTime": 0,
"qualifiedName": "test_lineage.table3",
"name": "table3",
"retention": 0
},
"lastModifiedTS": "1",
"guid": "16b93b78-8683-4f88-9651-24c4a9d797b0",
"status": "ACTIVE",
"displayText": "table3",
"classificationNames": [],
"meaningNames": [],
"meanings": [],
"isIncomplete": false,
"labels": [],
"isIndexed": true
},
"cb22ba23-47a2-4149-ade6-e3d9642fe592": {
"typeName": "hive_table",
"attributes": {
"temporary": false,
"lastAccessTime": 0,
"createTime": 0,
"qualifiedName": "test_lineage.table1",
"name": "table1",
"retention": 0
},
"lastModifiedTS": "1",
"guid": "cb22ba23-47a2-4149-ade6-e3d9642fe592",
"status": "ACTIVE",
"displayText": "table1",
"classificationNames": [],
"meaningNames": [],
"meanings": [],
"isIncomplete": false,
"labels": [],
"isIndexed": true
},
"bbeacce6-5bde-46f7-8fe4-689cbb36ba51": {
"typeName": "hive_view_query",
"attributes": {
"qualifiedName": "test_lineage.HiveQuery1",
"name": "HiveQuery1",
"columnMapping": "[{\"DatasetMapping\":{\"Source\":\"test_lineage.table1\",\"Sink\":\"test_lineage.table2\"},\"ColumnMapping\":[{\"Source\":\"column1\",\"Sink\":\"column1\"},{\"Source\":\"column2\",\"Sink\":\"column2\"}]}]"
},
"lastModifiedTS": "1",
"guid": "bbeacce6-5bde-46f7-8fe4-689cbb36ba51",
"status": "ACTIVE",
"displayText": "HiveQuery1",
"classificationNames": [],
"meaningNames": [],
"meanings": [],
"isIncomplete": false,
"labels": [],
"isIndexed": true
},
"2a12b3ff-5816-4222-833a-035bf82e06e0": {
"typeName": "hive_table",
"attributes": {
"temporary": false,
"lastAccessTime": 0,
"createTime": 0,
"qualifiedName": "test_lineage.table2",
"name": "table2",
"retention": 0
},
"lastModifiedTS": "1",
"guid": "2a12b3ff-5816-4222-833a-035bf82e06e0",
"status": "ACTIVE",
"displayText": "table2",
"classificationNames": [],
"meaningNames": [],
"meanings": [],
"isIncomplete": false,
"labels": [],
"isIndexed": true
}
},
"includeParent": false,
"relations": [
{
"fromEntityId": "2a12b3ff-5816-4222-833a-035bf82e06e0",
"toEntityId": "16b93b78-8683-4f88-9651-24c4a9d797b0",
"relationshipId": "23df8e3e-b066-40b2-be29-9fd90693c51b",
"columnMapping": "[{\"Source\":\"column1\",\"Sink\":\"column1\"},{\"Source\":\"column2\",\"Sink\":\"column2\"}]"
},
{
"fromEntityId": "bbeacce6-5bde-46f7-8fe4-689cbb36ba51",
"toEntityId": "2a12b3ff-5816-4222-833a-035bf82e06e0",
"relationshipId": "5fe8d378-39cd-4c6b-8ced-91b0152d3014"
},
{
"fromEntityId": "cb22ba23-47a2-4149-ade6-e3d9642fe592",
"toEntityId": "bbeacce6-5bde-46f7-8fe4-689cbb36ba51",
"relationshipId": "73e084bf-98a3-45fb-a1e4-c56cc40661b8"
}
],
"parentRelations": [],
"widthCounts": {
"INPUT": {
"cb22ba23-47a2-4149-ade6-e3d9642fe592": 0,
"bbeacce6-5bde-46f7-8fe4-689cbb36ba51": 1,
"2a12b3ff-5816-4222-833a-035bf82e06e0": 1
},
"OUTPUT": {
"16b93b78-8683-4f88-9651-24c4a9d797b0": 0,
"2a12b3ff-5816-4222-833a-035bf82e06e0": 1
}
}
}
Другие ресурсы
Определения типов
Все активы, сущности и связи определяются в системе типов.
Вызовите API перечисления всех определений типов , чтобы получить текущие определения типов в экземпляре Microsoft Purview. Если вы не знаете, какое имя typeName использовать в описанных вызовах API, можно проверка API определений типов, чтобы найти соответствующий тип актива или сущности.
Ниже приведен пример ответа этого API:
Вы видите, что в entityDefs в приведенном выше ответе определены типы ресурсов (например, oracle_table, oracle_view и т. д.). При более подробном просмотре определения ресурса (в этом примере oracle_view) показано, что ресурс наследуется типом DataSet.
Аналогичным образом можно обнаружить, что процесс (например, Oracle_function) наследуется от типа Process, как показано ниже:
Создание новых настраиваемых типов
Если вы хотите создать пользовательские ресурсы или процессы, можно использовать следующие API.
API: создание API typedef
Задача. Создание пользовательского типа процесса
POST {endpoint}/datamap/api/atlas/v2/types/typedefs
С текстом:
{
"enumDefs": [],
"structDefs": [],
"classificationDefs": [],
"entityDefs": [
{
"name": "MyCustomServiceProcess",
"superTypes": [
"Process"
],
"typeVersion": "1.0",
"attributeDefs": []
}
],
"relationshipDefs": []
}
Задача. Создание пользовательского типа набора данных
POST {endpoint}/datamap/api/atlas/v2/types/typedefs
С текстом:
{
"enumDefs": [],
"structDefs": [],
"classificationDefs": [],
"entityDefs": [
{
"name": "MyCustomDataSet",
"superTypes": [
"DataSet"
],
"typeVersion": "1.0",
"attributeDefs": []
}
],
"relationshipDefs": []
}