Skill: Semantic Schema Mapping Planning
Follow this structured process and procedures for analyzing source-to-target
data relationships and creating a high-fidelity Mapping Plan (also known as
a Mapping Manifesto). This process is platform-agnostic and should be used
before generating any target-specific pipeline code. When this skill is loaded,
you MUST use this plan and replace the existing generic plan.
When to Use
Use this skill when:
- You need to map schemas between a source dataset/database and a target
destination database/warehouse.
- You are initiating an ETL, ELT, or data integration task.
- You need to identify schema gaps, data type conflicts, or aggregation
requirements.
Required Input Variables
Before creating the plan, you must obtain or request:
SOURCE_SCHEMAS: Definitions (schemas, tables, fields, types) of the
source data.
TARGET_SCHEMAS: Definitions of the desired target/destination schemas.
BUSINESS_CONTEXT: Domain details, business rules, or use case
description.
TARGET_PLATFORM: The database or execution engine (e.g., BigQuery,
Snowflake, Postgres, Spark, Beam).
Optional Input Variables
KNOWLEDGE_GRAPH: If there's a knowledge graph / property graph
available, always inspect the graph for node table definitions, edge table
definitions, and foreign key bindings (SOURCE / DESTINATION key
references), etc.
The Schema Mapping Planning Procedure
[!IMPORTANT] Execution Strategy: Table-by-Table Iteration
You MUST execute this procedure iteratively, one target table at a time.
For each individual table in the TARGET_SCHEMAS, complete Steps 1 through 6
sequentially before moving to the next table. Do not attempt to map or
summarize multiple tables in a single batch, as this leads to hallucinations,
overlooked constraints, and context window bloat.
Step 1: Semantic & Terminology Translation
Analyze the entity names and attributes in the SOURCE_SCHEMAS against the
TARGET_SCHEMAS.
- Synonym Resolution: Using the
BUSINESS_CONTEXT, map matching concepts
with different names (e.g., client_id vs customer_num).
- Identify Domain Standards: Match field values or formats to known
standards (e.g., ISO country codes, currency codes, UN/LOCODE, UUIDs) based
on the business context.
- Verify Domain Semantics: Do not rely purely on lexical matching (name
similarity). Verify the functional business purpose of the entities in both
schemas. Ensure that a target table representing a specific business
resource maps to a source table modeling that same resource rather than an
unrelated administrative log or generic list table sharing a similar name.
Step 2: Establish the Anchor Table
For each table or collection in the TARGET_SCHEMAS:
- Identify the primary source table (the "Anchor Table") that holds the
core records for this target.
- Identify contributing/lookup tables in the source that will enrich the
target records.
- Prefer Structured Tables over Generic Key-Value Tables: If the same
attribute exists in both a structured column in a domain table and as a
generic property in an Entity-Attribute-Value (EAV) key-value/properties
table, always anchor on the structured table to ensure schema stability and
performant joins.
Step 3: Proactive Data Sampling & Inspection
If a target field mapping is ambiguous or schema types do not tell the whole
story (e.g., verifying if a timestamp is ISO-8601, if a string is a JSON array,
or checking the distribution of values):
- Proactive Inspection: If environment access allows, run
platform-specific queries (e.g.,
SELECT ... LIMIT 10, SELECT COUNT(DISTINCT ... )) to sample values.
- User Inquiry: If direct access is not possible, output sample queries
and ask the user to provide the output to confirm assumptions before
finalizing the plan.
Step 4: Perform Field-Level Gap Analysis & Cleanliness Design
Evaluate every column in each target table to determine its source mapping.
Categorize mappings and plan cleanliness transformations:
- Direct Mapping: A 1-to-1 match.
- Derived Mapping: Requires type casting, string manipulation, date
formatting, mathematical derivation, or case statement logic.
- Joined Mapping: Requires looking up values from contributing tables
using defined join keys.
- Aggregated Mapping: Requires collapsing 1-to-many relationships (e.g.,
calculating
SUM, COUNT, ARRAY_AGG or string concatenation).
- Gaps (Unmapped fields): Target fields that do not exist in the source.
- Constraint Checking: Verify whether the target column has a
NOT NULL or REQUIRED constraint in the target schema.
- Handling Nullable Gaps: If the target column is nullable, explicitly
flag it as
NULL or define a default value.
- Handling Non-Nullable Gaps: If the target column is
NOT NULL, you
MUST NOT map it to NULL. (Rationale: Mapping NOT NULL target columns
to NULL will cause execution-time database constraint violations and
pipeline failures). You must identify a source field to derive it from,
default it to a valid non-null placeholder (e.g., 'UNKNOWN', 0, or
default dates), or define logic to generate a valid unique reference.
Universal Data Cleanliness Rules to Incorporate in Mappings:
- Null Standardization: Map source strings like
"NULL", "None",
"N/A", or empty spaces to true database NULL values.
- Trim & Casing: Plan to trim leading/trailing whitespaces. Convert
standardized codes (e.g., ISO codes, status strings) to uppercase.
- Temporal Consistency: Plan to parse all source timestamps into standard
ISO-8601 format (
YYYY-MM-DDTHH:MM:SSZ) or standard destination TIMESTAMP
format. Plan checks to ensure logical temporal progression (e.g.,
start_time <= end_time).
- Defensive Checks: Plan checks for strict destination types (e.g.,
checking if string is a valid number before casting to
DECIMAL).
Step 5: Map Relationships & Joins
Specify the logical join path to connect the Anchor Table with all contributing
source tables:
- Define the join condition/keys (e.g.,
source_order.customer_id = source_customer.id).
- Identify join scale properties:
- Large-to-Large: Joining two high-volume transaction tables.
- Large-to-Small: Joining a transaction table to a static lookup table
(ideal for Map-side/Broadcast joins to optimize speed/cost).
- Document potential join challenges:
- Many-to-many risks or potential duplicate generation.
- Type mismatches on join keys (e.g., joining an
INT column to a
STRING column).
- Graph Validation: If a graph was identified in input, cross-reference
the proposed join conditions with the graph's edge table definitions to
validate foreign key relationships.
Step 6: Draft the "Mapping Manifesto" (Output Format & Example)
Analyze the schemas and reference the ONE_SHOT_EXAMPLE below to structure your
output.
ONE_SHOT_EXAMPLE (How to Structure the Mapping Manifesto)
Example Source Schemas
dataset: my_music_library
style: {id: int, style: string}
band: {name: string, biography: string, style: int}
cd: {name: string, year: int, artist: string, numbers: array<string>}
track: {id: string, number: int, name: string}
Example Target Schemas
dataset: music_standard
artist: {name: string, albums: array<string>}
album: {name: string, year: int, genre: string, tracks: array<string>}
The Mapping Manifesto (Expected Output Format)
For each target table, document your column-to-column reasoning:
# Mapping Plan: `album`
* **Anchor Source Table**: `cd`
* **Join Paths & Optimization**:
* `cd` JOIN `band` ON `cd.artist = band.name`
* `band` JOIN `style` ON `band.style = style.id`
* `cd` JOIN `track` ON `track.id IN UNNEST(cd.numbers)`
### Field Mappings
| Target Field | Source Field / Logic | Mapping Type | Rationale / Transformation Details |
| :--- | :--- | :--- | :--- |
| `album.name` | `cd.name` | Direct | A CD is a physical medium representing an album; direct semantic match |
| `album.year` | `cd.year` | Direct | Direct semantic match for release year |
| `album.genre` | `style.style` | Joined | Resolved via `cd.artist` -> `band.name` -> `band.style` (ID) -> `style.id` -> `style.style` (String) |
| `album.tracks` | `ARRAY_AGG(track.name)` | Aggregated | Aggregation Point: Collapses 1-to-many track IDs in `cd.numbers` into an array of track names |
Critical Operational Rules
- Plan Before Execution: You MUST NOT generate any ETL code,
target-specific pipeline configurations, or migration scripts until the
Mapping Manifesto has been presented to and approved by the user.
(Rationale: Establishing clear mapping logic first prevents coding errors,
avoids circular dependencies, and ensures user alignment on semantic
mappings before wasting resources on implementation).
- Strict Schema Grounding: Every source table and field name referenced in
the mapping plan MUST exactly match the names and data types present in the
provided
SOURCE_SCHEMAS. You MUST NOT reference non-existent columns,
guess field names, or make assumptions about source schemas without
explicitly confirming them in the schema definitions. (Rationale: Proposing
guesses leads to compilation errors and invalid mapping specifications).
- Target Schema Constraint Integrity: You must never propose a mapping
that writes
NULL to a column defined as NOT NULL or REQUIRED in the
TARGET_SCHEMAS.
- Exhaustive Field Search: Before declaring a target field as an "Unmapped
/ Gap", search all available source schemas to verify the data is not in a
less-obvious table. (Rationale: Lazy mappings that default target fields to
NULL lead to downstream data loss and incomplete pipelines).
- Defensive Type Mapping: Explicitly plan the transformation rules for
strict destination types (e.g.
TIMESTAMP, BOOLEAN, DECIMAL) to avoid
load failures. (Rationale: Different databases and platforms handle type
validation strictly; pre-planning casts prevents execution-time runtime
errors).
- Data Integrity Check: Identify join conditions that could cause
Cartesian product expansion or data duplication, and note prevention
strategies in the plan. (Rationale: Unvalidated joins can distort
aggregated metrics or exhaust processing memory on large datasets).
1---2name: schema-mapping3license: Apache-2.04metadata:5 version: v16 publisher: google7description: >-8 Guides the process of analyzing, mapping, and documenting transformations between source and target schemas for any database, data warehouse, or data platform. Focuses exclusively on creating a high-fidelity mapping plan (Mapping Manifesto).9 Used when initiating an ETL, ELT, or data integration task with schema mapping specification for multiple tables (i.e. more than 3 tables) before writing code.10 Do NOT use this skill for basic SQL generation without mapping requirements, or when the user already has a complete mapping specification.11---1213# Skill: Semantic Schema Mapping Planning1415Follow this structured process and procedures for analyzing source-to-target16data relationships and creating a high-fidelity **Mapping Plan** (also known as17a **Mapping Manifesto**). This process is platform-agnostic and should be used18before generating any target-specific pipeline code. When this skill is loaded,19you MUST use this plan and replace the existing generic plan.2021## When to Use2223Use this skill when:2425- You need to map schemas between a source dataset/database and a target26 destination database/warehouse.27- You are initiating an ETL, ELT, or data integration task.28- You need to identify schema gaps, data type conflicts, or aggregation29 requirements.3031--------------------------------------------------------------------------------3233## Required Input Variables3435Before creating the plan, you must obtain or request:36371. **`SOURCE_SCHEMAS`**: Definitions (schemas, tables, fields, types) of the38 source data.392. **`TARGET_SCHEMAS`**: Definitions of the desired target/destination schemas.403. **`BUSINESS_CONTEXT`**: Domain details, business rules, or use case41 description.424. **`TARGET_PLATFORM`**: The database or execution engine (e.g., BigQuery,43 Snowflake, Postgres, Spark, Beam).4445## Optional Input Variables46471. **`KNOWLEDGE_GRAPH`**: If there's a knowledge graph / property graph48 available, always inspect the graph for node table definitions, edge table49 definitions, and foreign key bindings (`SOURCE` / `DESTINATION` key50 references), etc.5152--------------------------------------------------------------------------------5354## The Schema Mapping Planning Procedure5556> [!IMPORTANT] **Execution Strategy: Table-by-Table Iteration**57>58> You MUST execute this procedure **iteratively, one target table at a time**.59> For each individual table in the `TARGET_SCHEMAS`, complete Steps 1 through 660> sequentially before moving to the next table. Do not attempt to map or61> summarize multiple tables in a single batch, as this leads to hallucinations,62> overlooked constraints, and context window bloat.6364### Step 1: Semantic & Terminology Translation6566Analyze the entity names and attributes in the `SOURCE_SCHEMAS` against the67`TARGET_SCHEMAS`.68691. **Synonym Resolution**: Using the `BUSINESS_CONTEXT`, map matching concepts70 with different names (e.g., `client_id` vs `customer_num`).712. **Identify Domain Standards**: Match field values or formats to known72 standards (e.g., ISO country codes, currency codes, UN/LOCODE, UUIDs) based73 on the business context.743. **Verify Domain Semantics**: Do not rely purely on lexical matching (name75 similarity). Verify the functional business purpose of the entities in both76 schemas. Ensure that a target table representing a specific business77 resource maps to a source table modeling that same resource rather than an78 unrelated administrative log or generic list table sharing a similar name.7980### Step 2: Establish the Anchor Table8182For each table or collection in the `TARGET_SCHEMAS`:83841. Identify the **primary source table** (the "Anchor Table") that holds the85 core records for this target.862. Identify **contributing/lookup tables** in the source that will enrich the87 target records.883. **Prefer Structured Tables over Generic Key-Value Tables**: If the same89 attribute exists in both a structured column in a domain table and as a90 generic property in an Entity-Attribute-Value (EAV) key-value/properties91 table, always anchor on the structured table to ensure schema stability and92 performant joins.9394### Step 3: Proactive Data Sampling & Inspection9596If a target field mapping is ambiguous or schema types do not tell the whole97story (e.g., verifying if a timestamp is ISO-8601, if a string is a JSON array,98or checking the distribution of values):991001. **Proactive Inspection**: If environment access allows, run101 platform-specific queries (e.g., `SELECT ... LIMIT 10`, `SELECT102 COUNT(DISTINCT ... )`) to sample values.1032. **User Inquiry**: If direct access is not possible, output sample queries104 and ask the user to provide the output to confirm assumptions before105 finalizing the plan.106107### Step 4: Perform Field-Level Gap Analysis & Cleanliness Design108109Evaluate every column in each target table to determine its source mapping.110Categorize mappings and plan cleanliness transformations:111112* **Direct Mapping**: A 1-to-1 match.113* **Derived Mapping**: Requires type casting, string manipulation, date114 formatting, mathematical derivation, or case statement logic.115* **Joined Mapping**: Requires looking up values from contributing tables116 using defined join keys.117* **Aggregated Mapping**: Requires collapsing 1-to-many relationships (e.g.,118 calculating `SUM`, `COUNT`, `ARRAY_AGG` or string concatenation).119* **Gaps (Unmapped fields)**: Target fields that do not exist in the source.120 * **Constraint Checking**: Verify whether the target column has a `NOT121 NULL` or `REQUIRED` constraint in the target schema.122 * **Handling Nullable Gaps**: If the target column is nullable, explicitly123 flag it as `NULL` or define a default value.124 * **Handling Non-Nullable Gaps**: If the target column is `NOT NULL`, you125 MUST NOT map it to `NULL`. *(Rationale: Mapping NOT NULL target columns126 to NULL will cause execution-time database constraint violations and127 pipeline failures).* You must identify a source field to derive it from,128 default it to a valid non-null placeholder (e.g., `'UNKNOWN'`, `0`, or129 default dates), or define logic to generate a valid unique reference.130131#### Universal Data Cleanliness Rules to Incorporate in Mappings:1321331. **Null Standardization**: Map source strings like `"NULL"`, `"None"`,134 `"N/A"`, or empty spaces to true database `NULL` values.1352. **Trim & Casing**: Plan to trim leading/trailing whitespaces. Convert136 standardized codes (e.g., ISO codes, status strings) to uppercase.1373. **Temporal Consistency**: Plan to parse all source timestamps into standard138 ISO-8601 format (`YYYY-MM-DDTHH:MM:SSZ`) or standard destination `TIMESTAMP`139 format. Plan checks to ensure logical temporal progression (e.g.,140 `start_time <= end_time`).1414. **Defensive Checks**: Plan checks for strict destination types (e.g.,142 checking if string is a valid number before casting to `DECIMAL`).143144### Step 5: Map Relationships & Joins145146Specify the logical join path to connect the Anchor Table with all contributing147source tables:1481491. Define the join condition/keys (e.g., `source_order.customer_id =150 source_customer.id`).1512. Identify join scale properties:152 - **Large-to-Large**: Joining two high-volume transaction tables.153 - **Large-to-Small**: Joining a transaction table to a static lookup table154 (ideal for Map-side/Broadcast joins to optimize speed/cost).1553. Document potential join challenges:156 - Many-to-many risks or potential duplicate generation.157 - Type mismatches on join keys (e.g., joining an `INT` column to a158 `STRING` column).1594. **Graph Validation**: If a graph was identified in input, cross-reference160 the proposed join conditions with the graph's edge table definitions to161 validate foreign key relationships.162163### Step 6: Draft the "Mapping Manifesto" (Output Format & Example)164165Analyze the schemas and reference the `ONE_SHOT_EXAMPLE` below to structure your166output.167168#### ONE_SHOT_EXAMPLE (How to Structure the Mapping Manifesto)169170##### Example Source Schemas171172```markdown173dataset: my_music_library174style: {id: int, style: string}175band: {name: string, biography: string, style: int}176cd: {name: string, year: int, artist: string, numbers: array<string>}177track: {id: string, number: int, name: string}178```179180##### Example Target Schemas181182```markdown183dataset: music_standard184artist: {name: string, albums: array<string>}185album: {name: string, year: int, genre: string, tracks: array<string>}186```187188##### The Mapping Manifesto (Expected Output Format)189190For each target table, document your column-to-column reasoning:191192```markdown193# Mapping Plan: `album`194* **Anchor Source Table**: `cd`195* **Join Paths & Optimization**:196 * `cd` JOIN `band` ON `cd.artist = band.name`197 * `band` JOIN `style` ON `band.style = style.id`198 * `cd` JOIN `track` ON `track.id IN UNNEST(cd.numbers)`199200### Field Mappings201202| Target Field | Source Field / Logic | Mapping Type | Rationale / Transformation Details |203| :--- | :--- | :--- | :--- |204| `album.name` | `cd.name` | Direct | A CD is a physical medium representing an album; direct semantic match |205| `album.year` | `cd.year` | Direct | Direct semantic match for release year |206| `album.genre` | `style.style` | Joined | Resolved via `cd.artist` -> `band.name` -> `band.style` (ID) -> `style.id` -> `style.style` (String) |207| `album.tracks` | `ARRAY_AGG(track.name)` | Aggregated | Aggregation Point: Collapses 1-to-many track IDs in `cd.numbers` into an array of track names |208```209210--------------------------------------------------------------------------------211212## Critical Operational Rules213214* **Plan Before Execution**: You MUST NOT generate any ETL code,215 target-specific pipeline configurations, or migration scripts until the216 Mapping Manifesto has been presented to and approved by the user.217 *(Rationale: Establishing clear mapping logic first prevents coding errors,218 avoids circular dependencies, and ensures user alignment on semantic219 mappings before wasting resources on implementation).*220* **Strict Schema Grounding**: Every source table and field name referenced in221 the mapping plan MUST exactly match the names and data types present in the222 provided `SOURCE_SCHEMAS`. You MUST NOT reference non-existent columns,223 guess field names, or make assumptions about source schemas without224 explicitly confirming them in the schema definitions. *(Rationale: Proposing225 guesses leads to compilation errors and invalid mapping specifications).*226* **Target Schema Constraint Integrity**: You must never propose a mapping227 that writes `NULL` to a column defined as `NOT NULL` or `REQUIRED` in the228 `TARGET_SCHEMAS`.229* **Exhaustive Field Search**: Before declaring a target field as an "Unmapped230 / Gap", search all available source schemas to verify the data is not in a231 less-obvious table. *(Rationale: Lazy mappings that default target fields to232 NULL lead to downstream data loss and incomplete pipelines).*233* **Defensive Type Mapping**: Explicitly plan the transformation rules for234 strict destination types (e.g. `TIMESTAMP`, `BOOLEAN`, `DECIMAL`) to avoid235 load failures. *(Rationale: Different databases and platforms handle type236 validation strictly; pre-planning casts prevents execution-time runtime237 errors).*238* **Data Integrity Check**: Identify join conditions that could cause239 Cartesian product expansion or data duplication, and note prevention240 strategies in the plan. *(Rationale: Unvalidated joins can distort241 aggregated metrics or exhaust processing memory on large datasets).*