Поделиться через


Создание и получение связей с помощью REST API

В этом руководстве описано, как использовать REST API Purview для выполнения:

  1. Создание ресурсов и связей происхождения между ресурсами данных.
  2. Связи и пути происхождения запросов.

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:

Происхождение данных DataSet-Process-DataSet.

Пример 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 выше) станет следующим:

DataSet — DataSet lineage.

Обратите внимание, что таблица 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:

Ответ API TypeDef 1.

Вы видите, что в entityDefs в приведенном выше ответе определены типы ресурсов (например, oracle_table, oracle_view и т. д.). При более подробном просмотре определения ресурса (в этом примере oracle_view) показано, что ресурс наследуется типом DataSet.

Ответ API TypeDef 2.

Аналогичным образом можно обнаружить, что процесс (например, Oracle_function) наследуется от типа Process, как показано ниже:

Ответ API TypeDef 3.

Создание новых настраиваемых типов

Если вы хотите создать пользовательские ресурсы или процессы, можно использовать следующие 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": []
}