Pembuatan modul produk data

Pembuatan modul produk data kustom diperlukan untuk menentukan logika bisnis dan model analitis Anda sendiri, sehingga Anda dapat menjalankan perhitungan pada tabel dasar dan mengemasnya ke dalam set data yang dapat di-deploy.

Prasyarat

Saat membuat modul produk data kustom, sebaiknya gunakan namespace kustom khusus untuk mengemasnya. Selain itu, pastikan tabel sumber yang akan Anda gunakan ada di set data fondasi data.

Pembuatan modul produk data

Definisi modul produk data memerlukan langkah-langkah berikut:

  • Pendaftaran modul produk data dalam file config/config.yaml, dengan memperluas daftar data.modules.products dengan entri:
[...]
data:
  [...]
  # Configuration for data foundation and product modules.
  modules:
    # List of foundation modules.
    foundation:
      [...]
    # List of data product modules.
    product:
      [...]
      - moduleId:  product_module_id
        type:  custom_namespace.flight_usd
        dependsOn:
          sapModule: erp
          sapModuleCustNS:  foundation_module_id
        dataTargetId: product_target
        enabled: true
        tableSettings: "table_settings.yaml"
        # Optional, references file in `config/custom_namespace_path/data_product/product_module_id/`
        # If omitted, defaults to src/data_modules/custom_namespace_path/data_product/table_settings.default.yaml.
[...]
  • Pembuatan file tableSettings (misalnya, config/custom_namespace_path/data_product/product_module_id/table_settings.yaml). YAML ini mengontrol konfigurasi tabel seperti perwujudan dan detail pengoptimalan BigQuery:
common:
  custom_sales_summary:
    materialization_type: "table"
    tags: ["custom", "sales", "reporting"]
    partition_details:
      column: "created_date"
      partition_type: "date"
      time_grain: "day"
    cluster_details:
      columns:
        - "customer_id"
  • Pembuatan file anotasi

File anotasi <tablename>.yaml dibuat untuk setiap artefak output produk data (tabel, tampilan) dan menjelaskan kolom dan bidang dalam format YAML. Selama kompilasi, builder akan otomatis menelusuri anotasi dalam folder annotations/ produk (misalnya, annotations/custom_sales_summary.yaml), menggabungkan string ini langsung ke definisi skema Dataform output sehingga dipertahankan dalam metadata tabel BigQuery.

File anotasi config/custom_namespace_path/data_product/product_module_id/annotations/'tablename'.yaml memiliki format:

description: "Description of the table or view purpose"
fields:
  - name: "customer_id"                     # column name
    description: "Customer identifier"      # column description
  - name: "column2"
    description: "Description of Column 2"
  - name: "column3"
    description: "Description of Column 3"
  • Buat file manifest.yaml di folder produk data config/custom_namespace_path/data_product/product_module_id/, dengan mempertahankan jenis, tabel, dan dependensi modul. File manifes mengikuti format ini:

type: sales_performance
builder: sap_product     # Automatically resolves to the global SapProductBuilder fallback
dependencies:
  sapModule:
    type: sap
    supportedVersions:
      - ecc
      - s4

Contoh modul produk data

Untuk contoh penerbangan, kita membuat src/data_modules/custom_namespace_path/data_product/product_module_id/manifest.yaml dengan konten

type: product_module_id
dependencies:
  sapModule:
    type: cortex.sap
    supported_versions:
      - ecc
      - s4
    tables:
      common:
        - tcurr
  sapModuleCustNS:
    type:  custom_namespace .sap
    supported_versions:
      - ecc
      - s4
    tables:
      common:
        - sflight
builder: sap_product
  • Pada langkah berikutnya, perluas file setelan tabel yang dirujuk untuk tabel produk data.

Dalam contoh yang digunakan, buat: config/custom_namespace_path/data_product/product_module_id/table_settings.yaml dengan konten:

ecc:
  flights_usd:
    materializationType: incremental
    tags: [sap, dataproduct, masterdata]
s4:
  flights_usd:
    materializationType: incremental
    tags: [sap, dataproduct, masterdata]

  • Buat anotasi untuk tabel produk data guna memperkaya skema penyimpanan dengan deskripsi.

Dalam contoh yang digunakan, buat file: src/data_modules/custom_namespace_path/data_product/product_module_id/annotations/flights_usd.yaml dengan konten:

description: "Flight scheduling and pricing information, including currency conversion to USD."
fields:
  - name: "client_mandt"
    description: "Client (Mandant), PK"
  - name: "airline_code_carrid"
    description: "Airline Carrier ID, PK"
  - name: "flight_connection_number_connid"
    description: "Flight Number, PK"
  - name: "flight_date_fldate"
    description: "Flight Date"
  - name: "price_usd"
    description: "Price in USD"
  - name: "price"
    description: "Price in local currency"
  - name: "currency"
    description: "Local currency"
  • Logika bisnis produk data disimpan dalam file js atau sqlx.

Pada contoh yang diberikan, buat file src/data_modules/custom_namespace_path/data_product/product_module_id/definitions/flights_usd.js dengan konten:

// ___MODULE_CONTEXT___
// ___TABLE_CONFIG___

const moduleConfig = config.product[moduleContext.moduleId];
const sapModuleConfigDatasetId = moduleConfig.sources.sapModule.datasetId;
const sapModuleCustNSConfigDatasetId = moduleConfig.sources.sapModuleCustNS.datasetId;

const materializationType = tableConfig.materializationType || "incremental";

const incremental = require("includes/cortex/incremental.js");
const publish_config = require("includes/cortex/publish_config.js");

const publishConfig = publish_config.getPublishConfig(
   materializationType,
   tableConfig,
   moduleConfig,
   [
       "client_mandt",
       "airline_code_carrid",
       "flight_connection_number_connid",
       "flight_date_fldate"
   ]
);

publish("flight_usd", publishConfig).query(
   (ctx) => `
WITH flight_base AS (
   SELECT
       mandt,
       carrid,
       connid,
       fldate,
       price,
       currency,
       -- Convert flight date string (YYYYMMDD) to an integer to calculate SAP's inverted date key
       CAST(99999999 - CAST(fldate AS INT64) AS STRING) AS inverted_fldate
   FROM   ${ctx.ref(sapModuleCustNSConfigDatasetId, 'sflight')} AS flight
),
ranked_exchange_rates AS (
   SELECT
       f.mandt,
       f.carrid,
       f.connid,
       f.fldate,
       f.price,
       f.currency,
       t.ukurs,
       -- Window function to grab the closest historical exchange rate
       ROW_NUMBER() OVER (
           PARTITION BY f.mandt, f.carrid, f.connid, f.fldate
           ORDER BY t.gdatu ASC
       ) AS latest_rate_rank
   FROM flight_base f
   LEFT JOIN ${ctx.ref(sapModuleConfigDatasetId, 'tcurr')} AS t
     ON f.mandt = t.mandt
    AND t.kurst = 'M'       -- 'M' is the standard SAP default for average exchange rates
    AND t.fcurr = f.currency
    AND t.tcurr = 'USD'
    -- Chronological (rate_date <= flight_date) translates to (t.gdatu >= inverted_fldate)
    AND t.gdatu >= f.inverted_fldate
)

SELECT
   client_mandt,
   airline_code_carrid,
   flight_connection_number_connid,
   flight_date_fldate,
   price,
   currency,
   price_usd,
   CURRENT_TIMESTAMP() AS bq_loaded_at
FROM (
  SELECT
    mandt              AS client_mandt,
    carrid             AS airline_code_carrid,
    connid             AS flight_connection_number_connid,
    PARSE_TIMESTAMP('%Y%m%d', fldate) AS flight_date_fldate,
    price              AS price,
    currency           AS currency,
    -- Currency Conversion Logic
    CASE
       WHEN currency = 'USD' THEN price
       WHEN ukurs IS NULL   THEN NULL -- Handles cases where no exchange rate is found
       -- If UKURS is negative, it's an indirect quotation (1 USD = X Local) -> Divide
       WHEN ukurs < 0       THEN ROUND(price / ABS(ukurs), 2)
       -- If UKURS is positive, it's a direct quotation (1 Local = X USD) -> Multiply
       ELSE ROUND(price * ukurs, 2)
     END AS price_usd
  FROM ranked_exchange_rates
  WHERE latest_rate_rank = 1
)
${incremental.getWhere(ctx, ["flight_date_fldate"])}
`
);

Verifikasi ekstensi namespace kustom

Untuk memverifikasi keberhasilan ekstensi Google Cloud Cortex Framework dengan namespace, fondasi data, atau modul produk data, ikuti langkah-langkah berikut:

  1. Untuk men-deploy modul produk data, jalankan uv run targets build, deploy, atau build-and-deploy, seperti yang dijelaskan di halaman Deployment.

  2. Buka UI Dataform di Konsol BigQuery, lalu buka repositori dan ruang kerja.

  3. Di UI Dataform, pastikan tidak ada error kompilasi yang ditampilkan di konsol.

  4. Pastikan ekstensi yang disiapkan telah di-deploy ke jalur definitions/data_foundation/custom_namespace_path/ dan definitions/data_product/product_module_id/.

  5. Ikuti petunjuk untuk eksekusi pipeline Dataform.

  6. Di BigQuery, pastikan set data produk berisi tabel produk data, dan tabel tersebut diisi dengan data.