Criar e obter relacionamentos de linhagem usando a API REST

Neste tutorial, você aprenderá a usar APIs REST do Microsoft Purview para:

  1. Crie ativos e relações de linhagem entre os ativos de dados.
  2. Consultar relacionamentos/caminhos de linhagem

APIs referenciadas neste artigo:

Pré-requisitos

O uso dessas APIs requer as funções de Curador de Dados e Leitor de Dados. Confira este tutorial para obter detalhes sobre como obter o token de acesso.

Conceitos

Ativo

No Microsoft Purview, há dois tipos de ativos base: DataSet e Process.

  • Os ativos do DataSet que contêm dados como a Tabela SQL do Azure, a Tabela do Oracle etc. devem ser herdados do Conjunto de Dados.
  • Processar Ativos que processam dados, como um pipeline de dados, consulta, função etc., devem ser herdados do Processo.

Consulte ativos e tipos para entender as definições de tipo de conjuntos de dados e processos.

Relações e linhagem

No Microsoft Purview, há três tipos de relações para linhagem:

  • dataset_process_inputs: conecta o DataSet ao Processo, o que significa que o DataSet é a entrada do Processo
  • process_dataset_outputs: conecta o Processo ao Conjunto de Dados, o que significa que o Processo produz o Conjunto de Dados
  • direct_lineage_dataset_dataset: conecta DataSet1 a DataSet2, o que significa que DataSet1 é o upstream de DataSet2, embora não saibamos exatamente qual processo está entre eles

Exemplo 1:Aqui está um exemplo de linhagem com 2 conjuntos de dados, um processo e duas relações de linhagem:

Conjunto de Dados ---> dataset_process_inputs ---> Processo ---> process_dataset_outputs ---> Conjunto de Dados

Captura de tela mostrando DataSet a ser processado para linhagem DataSet.

Exemplo 2:Outro exemplo de linhagem com 2 DataSets e uma relação de linhagem:

Conjunto de Dados ---> direct_lineage_dataset_dataset ---> Conjunto de Dados

Captura de tela mostrando DataSet para linhagem DataSet.

Criar ativos e relações de linhagem entre os ativos de dados

Nas seções a seguir, vamos usar hive_table como um tipo de exemplo para DataSet e hive_query_process como um tipo de exemplo para Process. Criaremos ativos com esses dois tipos e criaremos linhagens entre eles. Você pode usar qualquer outro tipo, que herda de DataSet ou Process para criar linhagens.

Exemplo 1

Criar ativos via API

Se os ativos para os quais você deseja criar a linhagem ainda não tiverem sido criados no Microsoft Purview, você poderá chamar a API a seguir para criá-los.

API:Criar ativos em massa

Tarefa: Criar dois hive_tables como conjuntos de dados - tabela1 e tabela2, cada um com 2 hive_columns - coluna1 e coluna2.

POST {endpoint}/datamap/api/atlas/v2/entity/bulk

Com o corpo:

{
  "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"
        }
      }
    }    
  ]
}

Tarefa: Criar o ativo de processo 'hive_view_query'

POST {endpoint}/datamap/api/atlas/v2/entity/bulk

Com o corpo:

{
  "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"
    }
  ]
}

As chamadas de API acima resultam na criação de dois hive_tables(Datasets) e um hive_view_query(Process).

Crie relações de linhagem entre os conjuntos de dados e o processo

API:Criar Relação

Tarefa: Criar linhagem da tabela1 –> HiveQuery1 (ou seja, Conjunto de dados –> Processo)

POST {endpoint}/datamap/api/atlas/v2/relationship

Com o corpo:

{
        "typeName": "dataset_process_inputs",
        "guid": "-1",
        "end1": {
            "typeName": "hive_table",
            "uniqueAttributes": {
                "qualifiedName": "test_lineage.table1"
            }
        },
        "end2": {
            "typeName": "Process",
            "uniqueAttributes": {
                "qualifiedName": "test_lineage.HiveQuery1"
            }
        }
}

Tarefa: Criar linhagem de HiveQuery1 -> tabela2 (ou seja, Processo -> Conjunto de dados)

POST {endpoint}/datamap/api/atlas/v2/relationship

Com o corpo:

{
        "typeName": "process_dataset_outputs",
        "guid": "-2",
        "end1": {
            "typeName": "Process",
            "uniqueAttributes": {
                "qualifiedName": "test_lineage.HiveQuery1"
            }
        },
        "end2": {
            "typeName": "hive_table",
            "uniqueAttributes": {
                "qualifiedName": "test_lineage.table2"
            }
        }
}

Exibir linhagem

Depois que os ativos e as relações de linhagem forem criados, você poderá marcar o gráfico de linhagem no Microsoft Purview:

DataSet-Process-DataSet lineage.

Exemplo 2

Criar uma tabela hive, tabela3, com duas colunas

API:Criar ativos em massa

Tarefa: Criar tabela3, com 2 hive_columns, coluna1 e coluna2

POST {endpoint}/datamap/api/atlas/v2/entity/bulk

Com o corpo:

{
"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"
        }
      }
    }
   ]
}

Criar linhagem direta entre a tabela 2 e a tabela 3, com mapeamento de coluna

API:Criar Relação

Tarefa: Criar linhagem da tabela2 a> tabela3 (ou seja, Conjunto de dados -> Conjunto de dados) com mapeamento de coluna

POST {endpoint}/datamap/api/atlas/v2/relationship

Com o corpo:

{
    "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\"}]"
    }
}

Exibir linhagem

Agora, o gráfico de linhagem (junto com o Exemplo 1 & o Exemplo 2 acima) se torna:

DataSet para linhagem de DataSet.

Observe que table2 está diretamente vinculado a table3, sem um HiveQuery entre eles.

Consultar relacionamentos/caminhos de linhagem

API:Obter linhagem por GUID

Tarefa: Obter linhagem da tabela2 via API REST

GET {{endpoint}}/api/atlas/v2/lineage/{{guid_of_table2}}?direction=BOTH

Abaixo, você pode Payload de resposta 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
        }
    }
}

Outros recursos

Definições de Tipo

Todos os Ativos/Entidades e Relacionamentos são definidos no sistema de tipos.

Chame a API de todas as definições de tipo da lista para obter as definições de tipo atuais em sua instância do Microsoft Purview. Se você não tiver certeza de qual typeName usar nas chamadas de API descritas, poderá marcar a API de definições de tipo para encontrar o tipo de ativo/entidade apropriado.

A seguir está um exemplo de resposta dessa API:

Resposta da API TypeDef 1.

Você pode ver que nos entityDefs na resposta acima, os tipos de ativos (como oracle_table, oracle_view etc.) são definidos. Uma análise adicional da definição do ativo (neste exemplo, oracle_view) mostra que o ativo é do tipo DataSet herdado.

Resposta da API TypeDef 2.

Da mesma forma, você pode descobrir que um processo (por exemplo, Oracle_function) é herdado do tipo "Processo" conforme mostrado:

Resposta da API TypeDef 3.

Criar novos tipos personalizados

Se você quiser criar ativos ou processos personalizados, poderá usar as APIs a seguir.

API:Criar API de Typedef

Tarefa: Criar um tipo de processo personalizado

POST {endpoint}/datamap/api/atlas/v2/types/typedefs

Com o corpo:

{
  "enumDefs": [],
  "structDefs": [],
  "classificationDefs": [],
  "entityDefs": [
    {
      "name": "MyCustomServiceProcess",
      "superTypes": [
        "Process"
      ],
      "typeVersion": "1.0",
      "attributeDefs": []
    }
  ],
  "relationshipDefs": []
}

Tarefa: Criar um tipo de conjunto de dados personalizado

POST {endpoint}/datamap/api/atlas/v2/types/typedefs

Com o corpo:

{
  "enumDefs": [],
  "structDefs": [],
  "classificationDefs": [],
  "entityDefs": [
    {
      "name": "MyCustomDataSet",
      "superTypes": [
        "DataSet"
      ],
      "typeVersion": "1.0",
      "attributeDefs": []
    }
  ],
  "relationshipDefs": []
}