REST API를 사용하여 관계 만들기 및 가져오기
이 자습서에서는 Purview REST API를 사용하여 다음을 하는 방법을 알아봅니다.
- 데이터 자산 간에 자산 및 계보 관계를 만듭니다.
- 계보 관계/경로를 쿼리합니다.
이 문서에서 참조하는 API는 다음과 같습니다.
필수 구성 요소
이러한 API를 사용하려면 데이터 큐레이터 및 데이터 판독기 역할이 필요합니다. 액세스 토큰을 가져오는 방법에 대한 자세한 내용은 이 자습서 를 참조하세요.
개념
자산
Purview에는 DataSet 및 Process라는 두 가지 유형의 기본 자산이 있습니다.
- Azure SQL Table, Oracle Table 등과 같은 데이터를 포함하는 DataSet 자산은 DataSet에서 상속되어야 합니다.
- 데이터 파이프라인, 쿼리, 함수 등과 같은 데이터를 처리하는 프로세스 자산은 Process에서 상속되어야 합니다.
데이터 세트 및 프로세스의 형식 정의를 이해하려면 자산 및 형식을 참조하세요.
계보 & 관계
Microsoft Purview에서는 계보에 대한 세 가지 유형의 관계를 정의합니다.
- dataset_process_inputs: DataSet를 프로세스에 연결합니다. 즉, DataSet은 프로세스의 입력입니다.
- process_dataset_outputs: Process를 DataSet에 연결합니다. 즉, 프로세스에서 DataSet을 생성합니다.
- direct_lineage_dataset_dataset: DataSet1을 DataSet2에 연결합니다. 즉, DataSet1은 DataSet2의 업스트림. 그 사이에 어떤 프로세스가 있는지는 정확히 알 수 없습니다.
예제 1:다음은 데이터 세트 2개, 프로세스 1개, 계보 관계 2개가 있는 계보의 예입니다.
데이터 세트 ---> dataset_process_inputs ---> 프로세스 ---> process_dataset_outputs ---> DataSet
예제 2:데이터 세트 2개와 계보 관계가 1개 있는 계보의 또 다른 예:
데이터 세트 ---> direct_lineage_dataset_dataset ---> DataSet
데이터 자산 간에 자산 및 계보 관계 만들기
다음 섹션에서는 hive_table DataSet의 예제 형식으로 사용하고 hive_query_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(데이터 세트)와 1개의 hive_view_query(Process)를 만듭니다.
데이터 세트와 프로세스 간의 계보 관계 만들기
API: 관계 만들기
작업: table1 -> 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(즉, 프로세스 -> 데이터 세트)
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: 자산 대량 만들기
작업: 2개 hive_columns, column1 및 column2를 사용하여 table3 만들기
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: 관계 만들기
작업: 열 매핑을 사용하여 table2 -> table3(즉, 데이터 세트 -> 데이터 세트)에서 계보 만들기
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는 두 테이블 사이에 HiveQuery가 없으면 table3에 직접 연결됩니다.
계보 관계/경로 쿼리
API: GUID로 계보 가져오기
작업: REST API를 통해 table2 계보 가져오기
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 instance 현재 형식 정의를 가져옵니다. 설명된 API 호출에서 사용할 typeName을 잘 모르는 경우 형식 정의 API를 검사 적절한 Asset/Entity 형식을 찾을 수 있습니다.
다음은 이 API의 샘플 응답입니다.
위의 응답에서 entityDefs에서 자산 형식(예: oracle_table, oracle_view 등)이 정의되어 있음을 알 수 있습니다. 자산의 정의(이 예제에서는 oracle_view)를 자세히 살펴보면 자산이 상속된 DataSet 형식임을 보여 줍니다.
마찬가지로 다음과 같이 프로세스(예: Oracle_function)가 "프로세스" 형식에서 상속된다는 것을 알 수 있습니다.
새 사용자 지정 형식 만들기
사용자 지정 자산 또는 프로세스를 만들려면 다음 API를 사용할 수 있습니다.
API: Typedef API 만들기
작업: 사용자 지정 프로세스 형식 만들기
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": []
}