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 daftardata.modules.productsdengan 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.yamldi folder produk dataconfig/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
jsatausqlx.
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:
Untuk men-deploy modul produk data, jalankan
uv run targets build,deploy, ataubuild-and-deploy, seperti yang dijelaskan di halaman Deployment.Buka UI Dataform di Konsol BigQuery, lalu buka repositori dan ruang kerja.
Di UI Dataform, pastikan tidak ada error kompilasi yang ditampilkan di konsol.
Pastikan ekstensi yang disiapkan telah di-deploy ke jalur
definitions/data_foundation/custom_namespace_path/dandefinitions/data_product/product_module_id/.Ikuti petunjuk untuk eksekusi pipeline Dataform.
Di BigQuery, pastikan set data produk berisi tabel produk data, dan tabel tersebut diisi dengan data.
- Langkah sebelumnya: Pembuatan modul fondasi data
- Kembali ke Ringkasan