All Products
Search
Document Center

DataWorks:Kueri alur data menggunakan DataWorks OpenAPI

Last Updated:Jun 17, 2026

Panduan ini menjelaskan cara menggunakan DataWorks OpenAPI (2024-05-18) untuk mengkueri alur data tabel dan bidang secara terprogram. Kami menyediakan contoh pemanggilan API dan kode SDK untuk analisis alur data skala besar yang otomatis.

Apa itu alur data?

Bayangkan Anda sedang meninjau laporan bisnis yang menunjukkan peningkatan signifikan pada penjualan kuartalan. Sebagai analis data atau manajer, Anda mungkin bertanya:

  • Bagaimana metrik "penjualan" ini dihitung?

  • Apa sumber data bisnis mentahnya? Apakah berasal dari tabel pesanan atau tabel transaksi pembayaran?

  • Langkah-langkah pemrosesan apa saja yang dilalui data tersebut—mulai dari bentuk mentah hingga laporan akhir—seperti pembersihan, transformasi, dan agregasi?

  • Jika data untuk metrik ini salah, laporan atau aplikasi hilir mana saja yang akan terdampak?

    image

Alur data yang jelas memberikan manfaat inti berikut:

  1. Pelacakan dan troubleshooting data
    Saat Anda menemukan anomali atau error pada data, Anda dapat mengikuti alur data ke hulu untuk dengan cepat menemukan logika perhitungan atau data sumber yang menyebabkan masalah tersebut. Hal ini secara signifikan mengurangi waktu troubleshooting.

  2. Analisis dampak
    Saat Anda perlu mengubah struktur tabel data, bidang, atau logika perhitungan, Anda dapat menganalisis alur data ke hilir untuk menilai secara akurat laporan data dan bisnis mana saja yang akan terdampak. Ini membantu menghindari konsekuensi tak terduga akibat perubahan tersebut.

  3. Tata kelola data dan kepercayaan
    Alur data yang jelas merupakan fondasi bagi manajemen aset data, penerapan standar data, dan pemantauan kualitas data. Alur data membuat siklus hidup data menjadi transparan, sehingga meningkatkan kepercayaan pemangku kepentingan terhadap data tersebut.

  4. Optimasi biaya dan inventaris aset
    Dengan menganalisis alur data, Anda dapat mengidentifikasi tabel data atau task komputasi yang tidak memiliki konsumen hilir. Hal ini memungkinkan Anda mengoptimalkan biaya gudang data dan menghentikan aset yang sudah usang.

Di DataWorks, sistem secara otomatis mengurai dan mencatat alur data yang dihasilkan oleh berbagai task komputasi, seperti task MaxCompute SQL dan EMR Spark. Dengan DataWorks OpenAPI, Anda dapat mengakses informasi alur data ini secara terprogram untuk mengintegrasikan kemampuan analisis alur data ke dalam platform manajemen data atau alur kerja O&M otomatis Anda sendiri.

Prasyarat: Dapatkan ID entitas

Untuk mengkueri alur data, Anda terlebih dahulu memerlukan pengenal unik untuk tabel data atau bidang target Anda. Pengenal ini, yang disebut entity ID, merupakan parameter yang diperlukan untuk pemanggilan API terkait metadata dan alur data.

Anda dapat memperoleh entity ID dengan salah satu dari dua cara berikut:

1. Dapatkan entity ID dari Konsol

Untuk sejumlah kecil tabel atau bidang yang sudah diketahui, metode tercepat adalah menyalin ID secara manual dari Konsol.

Dapatkan entity ID tabel

  1. Di Konsol DataWorks, buka modul Data Map.

  2. Cari dan navigasikan ke halaman detail tabel target.

  3. Di panel kiri Table Basic Information, temukan dan salin Entity ID.

    Entity ID memiliki format maxcompute-table:::<project_name>::<table_name>.

Dapatkan entity ID bidang

  1. Di halaman detail tabel target, buka tab Lineage dan pilih Field Lineage.

  2. Di graf alur bidang, klik node bidang yang diinginkan.

  3. Panel detail bidang akan muncul di sebelah kanan. Di panel tersebut, temukan dan salin Entity ID.

    Entity ID memiliki format maxcompute-column:::<project_name>::<table_name>::<field_name>.

2. Dapatkan entity ID secara massal melalui API

Jika Anda perlu memperoleh banyak entity ID, operasi manual bisa menjadi merepotkan. Dalam kasus ini, gunakan OpenAPI untuk melakukan kueri massal:

Kueri alur data dengan API ListLineages

Setelah Anda memperoleh entity ID, Anda dapat menggunakan API inti ListLineages untuk mengkueri hubungan alur data hulu dan hilirnya.

1. Parameter API utama

Tabel berikut menjelaskan parameter permintaan utama API ListLineages. Anda dapat melakukan debug API secara daring di OpenAPI Portal.

Parameter

Tipe

Deskripsi

SrcEntityId

String

Gunakan parameter ini untuk mengkueri alur data hilir. Masukkan ID entitas sumber (hulu) untuk mengkueri seluruh alur data hilirnya.

DstEntityId

String

Gunakan parameter ini untuk mengkueri alur data hulu. Masukkan ID entitas tujuan (hilir) untuk mengkueri seluruh alur data hulunya.

SrcEntityName

String

Digunakan bersama DstEntityId untuk melakukan pencarian fuzzy dan memfilter entitas hulu.

DstEntityName

String

Digunakan bersama SrcEntityId untuk melakukan pencarian fuzzy dan memfilter entitas hilir.

NeedAttachRelationship

Boolean

Menentukan apakah respons harus menyertakan informasi detail hubungan alur data. Atur parameter ini ke true untuk mendapatkan konteks lengkap.

Penting
  • Jika Anda memberikan SrcEntityId dan DstEntityId sekaligus, API akan mengembalikan hubungan alur data antara entitas hulu dan hilir yang ditentukan.

  • Jika SrcEntityId dan DstEntityId sama, API akan mengembalikan hubungan alur data di mana entitas tersebut mengarah ke dirinya sendiri.

2. Contoh pemanggilan

Asumsikan Anda memiliki tabel MaxCompute dengan entity ID-nya adalah maxcompute-table:::test_project::test_table.

Contoh 1: Kueri alur data hilir

Untuk mengkueri semua tabel hilir dari tabel ini, tentukan tabel tersebut sebagai sumber:

  • SrcEntityId: maxcompute-table:::test_project::test_table

  • NeedAttachRelationship: true

Untuk hanya menemukan tabel hilir yang namanya mengandung "report", tambahkan parameter DstEntityName:

  • DstEntityName: report

Contoh 2: Kueri alur data hulu

Untuk mengetahui tabel atau task mana saja yang menghasilkan tabel ini, tentukan tabel tersebut sebagai tujuan:

  • DstEntityId: maxcompute-table:::test_project::test_table

  • NeedAttachRelationship: true

Anda juga dapat menggunakan parameter SrcEntityName untuk memfilter sumber hulu.

3. Respons API

Pemanggilan sukses ke ListLineages mengembalikan daftar hubungan alur data. Setiap hubungan alur data berisi entitas sumber, entitas tujuan, dan informasi tentang asosiasinya.

Contoh tanggapan untuk hubungan lineage tunggal (JSON):

{
  "SrcEntity": {
    "Id": "maxcompute-table:::test_project::table_from",
    "Name": "table_from",
    "Attributes": {
      "rawEntityId": "maxcompute-table:::test_project::table_from"
    }
  },
  "DstEntity": {
    "Id": "maxcompute-table:::test_project::table_to",
    "Name": "table_to",
    "Attributes": {
      "project": "test_project",
      "region": "cn-shanghai",
      "table": "table_to"
    }
  },
  "Relationships": [
    {
      "Id": "123456789:maxcompute-table.test_project.table_from:maxcompute-table.test_project.table_to:maxcompute.SQL.76543xxx",
      "CreateTime": 1761089163548,
      "Task": {
        "Id": "76543xxx",
        "Type": "dataworks-sql",
        "Attributes": {
          "engine": "maxcompute",
          "channel": "1st",
          "taskInstanceId": "12345xxx",
          "projectId": "123456",
          "taskId": "76543xxx"
        }
      }
    }
  ]
}

Cara menafsirkan respons:

  • SrcEntity dan DstEntity: Mewakili entitas hulu dan hilir dari alur data, secara berurutan. Anda dapat menggunakan Id-nya untuk memanggil API GetTable atau GetColumn untuk mendapatkan metadata lebih detail.

  • Relationships: Menjelaskan bagaimana SrcEntity dan DstEntity diasosiasikan.

    • Task: Menjelaskan task yang membuat hubungan alur data ini. Jika task tersebut merupakan task terjadwal DataWorks, Task.Attributes berisi taskId dan taskInstanceId. Anda dapat menggunakan ID-ID ini untuk memanggil API GetTask guna mendapatkan definisi task dan status eksekusi secara detail.

Panduan praktis SDK Java

Contoh berikut menunjukkan cara mengimplementasikan alur kerja kueri alur data lengkap menggunakan SDK Java.

1. Prasyarat

  • Versi JDK: JDK 8 atau yang lebih baru.

  • Dependensi Maven: Tambahkan dependensi berikut ke file pom.xml proyek Anda. Ganti ${latest.version} dengan nomor versi terbaru SDK.

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>dataworks_public20240518</artifactId>
    <version>${latest.version}</version>
</dependency>

2. Contoh kode lengkap

Kode berikut menunjukkan cara menginisialisasi client, mengkueri alur data hulu dan hilir dari tabel tertentu, serta mencetak informasi penting.

import java.util.List;
import java.util.Map;
import com.aliyun.dataworks_public20240518.Client;
import com.aliyun.dataworks_public20240518.models.GetTableRequest;
import com.aliyun.dataworks_public20240518.models.GetTableResponse;
import com.aliyun.dataworks_public20240518.models.LineageEntity;
import com.aliyun.dataworks_public20240518.models.LineageRelationship;
import com.aliyun.dataworks_public20240518.models.LineageTask;
import com.aliyun.dataworks_public20240518.models.ListLineagesRequest;
import com.aliyun.dataworks_public20240518.models.ListLineagesResponse;
import com.aliyun.dataworks_public20240518.models.ListLineagesResponseBody.ListLineagesResponseBodyPagingInfo;
import com.aliyun.dataworks_public20240518.models.ListLineagesResponseBody.ListLineagesResponseBodyPagingInfoLineages;
import com.aliyun.dataworks_public20240518.models.Table;
import com.aliyun.tea.TeaException;
public class LineageQuerySample {
  /**
     * description :
     * <p>Menginisialisasi client menggunakan kredensial.</p>
     *
     * @return Client
     * @throws Exception
     */
  public static com.aliyun.dataworks_public20240518.Client createClient() throws Exception {
    com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
      // ID AccessKey Anda.
      .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
      // Rahasia AccessKey Anda.
      .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    // Untuk endpoint, lihat https://api.alibabacloud.com/product/dataworks-public.
    config.endpoint = "dataworks.cn-hangzhou.aliyuncs.com";
    return new com.aliyun.dataworks_public20240518.Client(config);
  }
  public static void main(String[] args_) throws Exception {
    Client client = LineageQuerySample.createClient();
    // ID entitas tabel yang akan dikueri. Ganti dengan ID entitas tabel MaxCompute Anda.
    String tableId = "maxcompute-table:::test_project::test_table";
    try {
      // 1. Kueri alur data hulu.
      ListLineagesRequest listLineagesRequest = new ListLineagesRequest()
        .setDstEntityId(tableId)
        .setNeedAttachRelationship(true)
        .setPageNumber(1)
        // Secara default, 10 catatan dikembalikan. Nilai maksimum adalah 100.
        .setPageSize(10);
      // Mendukung pencocokan fuzzy berbasis kata kunci dan penyaringan nama tabel hulu.
      listLineagesRequest.setSrcEntityName("demo");
      ListLineagesResponse listLineagesResponse = client.listLineages(listLineagesRequest);
      String requestId = listLineagesResponse.getBody().getRequestId();
      System.out.println("\nKueri alur data hulu");
      // Cetak ID permintaan untuk troubleshooting.
      System.out.println(requestId);
      ListLineagesResponseBodyPagingInfo pagingInfo = listLineagesResponse.getBody().getPagingInfo();
      if (pagingInfo.getTotalCount() > 0 && pagingInfo.getLineages() != null) {
        for (ListLineagesResponseBodyPagingInfoLineages lineage : pagingInfo.getLineages()) {
          // Dapatkan satu hubungan alur data dan kueri tabel hulu yang sesuai.
          LineageEntity srcEntity = lineage.getSrcEntity();
          System.out.println("============================================");
          System.out.println("ID: " + srcEntity.getId());
          System.out.println("Nama: " + srcEntity.getName());
          // Dapatkan informasi tabel hulu.
          Table table = getTable(client, srcEntity.getId());
          if (table != null) {
            System.out.println("Komentar: " + table.getComment());
            System.out.println("Waktu Pembuatan: " + table.getCreateTime());
            System.out.println("Waktu Modifikasi: " + table.getModifyTime());
          }
        }
      }
            // 2. Kueri alur data hilir.
            listLineagesRequest = new ListLineagesRequest()
                    .setSrcEntityId(tableId)
                    .setNeedAttachRelationship(true)
                    .setPageNumber(1)
                    // Secara default, 10 catatan dikembalikan. Nilai maksimum adalah 100.
                    .setPageSize(10);
            listLineagesResponse = client.listLineages(listLineagesRequest);
            requestId = listLineagesResponse.getBody().getRequestId();
            System.out.println("\nKueri alur data hilir");
            // Cetak ID permintaan untuk troubleshooting.
            System.out.println(requestId);
            pagingInfo = listLineagesResponse.getBody().getPagingInfo();
            if (pagingInfo.getTotalCount() > 0 && pagingInfo.getLineages() != null) {
                for (ListLineagesResponseBodyPagingInfoLineages lineage : pagingInfo.getLineages()) {
                    // Dapatkan satu hubungan alur data dan kueri tabel hilir yang sesuai.
                    LineageEntity dstEntity = lineage.getDstEntity();
                    System.out.println("============================================");
                    System.out.println("ID: " + dstEntity.getId());
                    System.out.println("Nama: " + dstEntity.getName());
                    // Dapatkan informasi tabel hilir.
                    Table table = getTable(client, dstEntity.getId());
                    if (table != null) {
                        System.out.println("Komentar: " + table.getComment());
                        System.out.println("Waktu Pembuatan: " + table.getCreateTime());
                        System.out.println("Waktu Modifikasi: " + table.getModifyTime());
                    }
                    // Urai hubungan alur data.
                    List<LineageRelationship> relationships = lineage.getRelationships();
                    if (relationships != null) {
                        for (LineageRelationship relationship : relationships) {
                            System.out.println("\n\tRelationshipId: " + relationship.getId());
                            System.out.println("\tRelationshipCreateTime: " + relationship.getCreateTime());
                            // Urai detail task.
                            LineageTask task = relationship.getTask();
                            Map<String, String> attributes = task.getAttributes();
                            // Untuk task terjadwal DataWorks, Anda dapat memperoleh ID task dan ID instans task dari atribut.
                            if (attributes != null && attributes.containsKey("taskId") && attributes.containsKey("taskInstanceId")) {
                                System.out.println("\tTaskId: " + attributes.get("taskId"));
                                System.out.println("\tTaskInstanceId: " + attributes.get("taskInstanceId"));
                            }
                        }
                    }
                }
            }
        } catch (TeaException error) {
            // Di lingkungan produksi, implementasikan penanganan exception yang kuat.
            // Pesan error
            System.out.println(error.getMessage());
            // URL diagnosa
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // Di lingkungan produksi, implementasikan penanganan exception yang kuat.
            // Pesan error
            System.out.println(error.getMessage());
            // URL diagnosa
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }
    public static Table getTable(Client client, String tableId) {
        // Kueri informasi tabel berdasarkan ID.
        GetTableRequest getTableRequest = new GetTableRequest()
                .setId(tableId)
                .setIncludeBusinessMetadata(true);
        try {
            GetTableResponse getTableResponse = client.getTable(getTableRequest);
            return getTableResponse.getBody().getTable();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return null;
    }
}

Panduan praktis SDK Python

Contoh berikut menunjukkan cara mengimplementasikan alur kerja kueri alur data lengkap menggunakan SDK Python.

1. Prasyarat

  • Versi Python: Python 3.6 atau yang lebih baru.

  • Instal SDK: Instal DataWorks Python SDK menggunakan pip. Ganti ${latest.version} dengan nomor versi terbaru SDK.

pip install alibabacloud_dataworks_public20240518==${latest.version}

2. Contoh kode lengkap

Kode berikut menunjukkan cara menginisialisasi client, mengkueri alur data hulu dan hilir dari tabel tertentu, serta mencetak informasi penting.

# -*- coding: utf-8 -*-
import os
import sys
from alibabacloud_dataworks_public20240518.client import Client as dataworks_public20240518Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dataworks_public20240518 import models as dataworks_public_20240518_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient


class LineageQuerySample:

    @staticmethod
    def create_client():
        """Menginisialisasi client menggunakan AccessKey Anda."""
        config = open_api_models.Config(
            # ID AccessKey Anda.
            access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
            # Rahasia AccessKey Anda.
            access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
        )
        # Untuk endpoint, lihat https://api.alibabacloud.com/product/dataworks-public.
        config.endpoint = 'dataworks.cn-hangzhou.aliyuncs.com'
        return dataworks_public20240518Client(config)

    @staticmethod
    def get_table(client, table_id):
        """Mendapatkan informasi tabel berdasarkan entity ID."""
        get_table_request = dataworks_public_20240518_models.GetTableRequest(
            id=table_id,
            include_business_metadata=True
        )
        try:
            response = client.get_table(get_table_request)
            return response.body.table
        except Exception as e:
            print(e)
            return None

    @staticmethod
    def main():
        client = LineageQuerySample.create_client()
        # ID entitas tabel yang akan dikueri. Ganti dengan ID entitas tabel MaxCompute Anda.
        table_id = 'maxcompute-table:::test_project::test_table'
        runtime = util_models.RuntimeOptions()

        try:
            # 1. Kueri alur data hulu.
            upstream_request = dataworks_public_20240518_models.ListLineagesRequest(
                dst_entity_id=table_id,
                need_attach_relationship=True,
                page_number=1,
                # Secara default, 10 catatan dikembalikan. Nilai maksimum adalah 100.
                page_size=10,
                # Mendukung pencocokan fuzzy berbasis kata kunci dan penyaringan nama tabel hulu.
                src_entity_name='demo'
            )
            upstream_response = client.list_lineages_with_options(upstream_request, runtime)
            print('\nKueri alur data hulu')
            print(upstream_response.body.request_id)
            paging_info = upstream_response.body.paging_info
            if paging_info.total_count > 0 and paging_info.lineages:
                for lineage in paging_info.lineages:
                    src_entity = lineage.src_entity
                    print('============================================')
                    print(f'ID: {src_entity.id}')
                    print(f'Nama: {src_entity.name}')
                    table = LineageQuerySample.get_table(client, src_entity.id)
                    if table:
                        print(f'Komentar: {table.comment}')
                        print(f'Waktu Pembuatan: {table.create_time}')
                        print(f'Waktu Modifikasi: {table.modify_time}')

            # 2. Kueri alur data hilir.
            downstream_request = dataworks_public_20240518_models.ListLineagesRequest(
                src_entity_id=table_id,
                need_attach_relationship=True,
                page_number=1,
                page_size=10
            )
            downstream_response = client.list_lineages_with_options(downstream_request, runtime)
            print('\nKueri alur data hilir')
            print(downstream_response.body.request_id)
            paging_info = downstream_response.body.paging_info
            if paging_info.total_count > 0 and paging_info.lineages:
                for lineage in paging_info.lineages:
                    dst_entity = lineage.dst_entity
                    print('============================================')
                    print(f'ID: {dst_entity.id}')
                    print(f'Nama: {dst_entity.name}')
                    table = LineageQuerySample.get_table(client, dst_entity.id)
                    if table:
                        print(f'Komentar: {table.comment}')
                        print(f'Waktu Pembuatan: {table.create_time}')
                        print(f'Waktu Modifikasi: {table.modify_time}')
                    # Urai hubungan alur data.
                    if lineage.relationships:
                        for relationship in lineage.relationships:
                            print(f'\n\tRelationshipId: {relationship.id}')
                            print(f'\tRelationshipCreateTime: {relationship.create_time}')
                            task = relationship.task
                            attributes = task.attributes
                            if attributes and 'taskId' in attributes and 'taskInstanceId' in attributes:
                                print(f'\tTaskId: {attributes["taskId"]}')
                                print(f'\tTaskInstanceId: {attributes["taskInstanceId"]}')

        except Exception as error:
            # Di lingkungan produksi, implementasikan penanganan exception yang kuat.
            print(error)
            UtilClient.assert_as_string(str(error))


if __name__ == '__main__':
    LineageQuerySample.main()