Creare e ottenere relazioni usando l'API REST
Questa esercitazione descrive come usare le API REST Purview per:
- Creare asset e relazioni di derivazione tra gli asset di dati.
- Eseguire query su relazioni/percorsi di derivazione.
API a cui si fa riferimento in questo articolo:
Prerequisiti
L'uso di queste API richiede ruoli Curatore dati e Lettore dati. Per informazioni dettagliate su come ottenere il token di accesso, vedere questa esercitazione .
Concetti
Risorsa
In Purview sono disponibili due tipi di asset di base: DataSet e Process.
- Gli asset di set di dati che contengono dati come Azure SQL Tabella, Tabella Oracle e così via devono essere ereditati da DataSet.
- Gli asset di elaborazione che elaborano i dati, ad esempio una pipeline di dati, una query, una funzione e così via, devono essere ereditati da Process.
Per informazioni sulle definizioni dei tipi di dataset e processi, vedere asset e tipi .
Relazioni & derivazione
In Microsoft Purview vengono definiti tre tipi di relazioni per la derivazione:
- dataset_process_inputs: connette DataSet a Process, ovvero il DataSet è l'input del processo
- process_dataset_outputs: connette Process a DataSet, ovvero il processo produce il dataset
- direct_lineage_dataset_dataset: connette DataSet1 a DataSet2, ovvero DataSet1 è l'upstream di DataSet2, anche se non si sa esattamente quale processo si trova tra di essi
Esempio 1:Ecco un esempio di derivazione con 2 dataset, un processo e due relazioni di derivazione:
Set di> dati --- dataset_process_inputs ---> processo ---> process_dataset_outputs ---> dataset
Esempio 2:Altro esempio di derivazione con 2 dataset e una relazione di derivazione:
Set di dati ---> direct_lineage_dataset_dataset ---> DataSet
Creare asset e relazioni di derivazione tra gli asset di dati
Nelle sezioni seguenti si prende hive_table come tipo di esempio per DataSet e hive_query_process come tipo di esempio per Process. Verranno creati asset con questi due tipi e verranno create linee di derivazione tra di essi. È possibile usare qualsiasi altro tipo, che eredita da DataSet o Process per creare derivazioni.
Esempio 1
Creare asset tramite API
Se gli asset per cui si vuole creare la derivazione non sono ancora stati creati in Microsoft Purview, è possibile chiamare l'API seguente per crearli.
Attività: creare due hive_tables come set di dati: table1 e table2, ognuno con 2 hive_columns: column1 e column2.
POST {endpoint}/datamap/api/atlas/v2/entity/bulk
Con il 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"
}
}
}
]
}
Attività: Creare l'asset di processo 'hive_view_query'
POST {endpoint}/datamap/api/atlas/v2/entity/bulk
Con il 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"
}
]
}
Le chiamate API precedenti comportano la creazione di due hive_tables (set di dati) e una hive_view_query(processo).
Creare relazioni di derivazione tra set di dati e processo
API: Creare una relazione
Attività: Creare derivazione da table1 -> HiveQuery1 (ovvero Set di dati -> Processo)
POST {endpoint}/datamap/api/atlas/v2/relationship
Con il corpo:
{
"typeName": "dataset_process_inputs",
"guid": "-1",
"end1": {
"typeName": "hive_table",
"uniqueAttributes": {
"qualifiedName": "test_lineage.table1"
}
},
"end2": {
"typeName": "Process",
"uniqueAttributes": {
"qualifiedName": "test_lineage.HiveQuery1"
}
}
}
Attività: Creare derivazione da HiveQuery1 -> table2 (ovvero Processo -> Set di dati)
POST {endpoint}/datamap/api/atlas/v2/relationship
Con il corpo:
{
"typeName": "process_dataset_outputs",
"guid": "-2",
"end1": {
"typeName": "Process",
"uniqueAttributes": {
"qualifiedName": "test_lineage.HiveQuery1"
}
},
"end2": {
"typeName": "hive_table",
"uniqueAttributes": {
"qualifiedName": "test_lineage.table2"
}
}
}
Visualizza derivazione
Dopo aver creato gli asset e le relazioni di derivazione, è possibile controllare il grafico di derivazione in Microsoft Purview:
Esempio 2
Creare una tabella hive, table3, con due colonne
Attività: Creare la tabella 3 con 2 hive_columns, column1 e column2
POST {endpoint}/datamap/api/atlas/v2/entity/bulk
Con il 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"
}
}
}
]
}
Creare derivazione diretta tra la tabella 2 e la tabella 3, con mapping delle colonne
API: Creare una relazione
Attività: Creare derivazione da table2 -> table3 (ovvero Set di dati -> Set di dati) con mapping di colonne
POST {endpoint}/datamap/api/atlas/v2/relationship
Con il 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\"}]"
}
}
Visualizza derivazione
Ora il grafo di derivazione (insieme all'esempio 1 &'esempio 2 precedente) diventa:
Si noti che table2 è direttamente collegato a table3, senza un HiveQuery tra di essi.
Relazioni/percorsi di derivazione delle query
API: Ottenere la derivazione per GUID
Attività: Ottenere la derivazione di table2 tramite l'API REST
GET {{endpoint}}/api/atlas/v2/lineage/{{guid_of_table2}}?direction=BOTH
Di seguito è possibile usare il payload della risposta 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
}
}
}
Ulteriori risorse
Definizioni dei tipi
Tutti gli asset/entità e le relazioni sono definiti nel sistema di tipi.
Chiamare elencare tutte le api di definizioni di tipo per ottenere le definizioni di tipo correnti nell'istanza di Microsoft Purview. Se non si è certi di quale typeName usare nelle chiamate API descritte, è possibile controllare l'API delle definizioni dei tipi per trovare il tipo di asset/entità appropriato.
Di seguito è riportata una risposta di esempio di questa API:
È possibile notare che negli entityDef nella risposta precedente vengono definiti i tipi di asset , ad esempio oracle_table, oracle_view e così via. Un'ulteriore analisi della definizione dell'asset (in questo esempio, oracle_view) mostra che l'asset è di tipo DataSet ereditato.
Analogamente, è possibile notare che un processo (ad esempio, Oracle_function) viene ereditato dal tipo "Processo", come illustrato di seguito:
Creare nuovi tipi personalizzati
Se si desidera creare asset o processi personalizzati, è possibile usare le API seguenti.
API: Creare l'API Typedef
Attività: Creare un tipo di processo personalizzato
POST {endpoint}/datamap/api/atlas/v2/types/typedefs
Con il corpo:
{
"enumDefs": [],
"structDefs": [],
"classificationDefs": [],
"entityDefs": [
{
"name": "MyCustomServiceProcess",
"superTypes": [
"Process"
],
"typeVersion": "1.0",
"attributeDefs": []
}
],
"relationshipDefs": []
}
Attività: Creare un tipo di dataset personalizzato
POST {endpoint}/datamap/api/atlas/v2/types/typedefs
Con il corpo:
{
"enumDefs": [],
"structDefs": [],
"classificationDefs": [],
"entityDefs": [
{
"name": "MyCustomDataSet",
"superTypes": [
"DataSet"
],
"typeVersion": "1.0",
"attributeDefs": []
}
],
"relationshipDefs": []
}