Zum Inhalt springen

Export nach Apache Ossie

Apache Ossie (früher Open Semantic Interchange) ist ein inkubierendes Apache-Projekt, das eine portable YAML/JSON-Spezifikation für den Austausch von Semantikmodellen über Analytics-, AI- und BI-Tools hinweg definiert. Saiku liefert einen Exporter, der jedes Mondrian-Schema liest und ein gültiges Ossie-Dokument produziert — dieselben Measure- und Dimensionsdefinitionen werden konsumierbar für dbt, GoodData, Snowflake, Databricks, Salesforce und jedes andere Tool mit einem Ossie-Konverter.

Schnellstart

Geben Sie ein Mondrian-XML-Schema hinein, holen Sie Ossie-YAML heraus:

Terminal-Fenster
java -jar saiku-launcher/target/saiku-4.6.0.jar ossie-export \
--in saiku-home/data/Pharma.xml \
--out pharma.ossie.yaml

Oder verwenden Sie stdin/stdout für Scripting:

Terminal-Fenster
cat schema.xml | saiku ossie-export > schema.ossie.yaml

Der Befehl endet mit Nicht-Null, wenn die Eingabe nicht gelesen werden kann (Exit 2) oder die Ausgabe nicht geschrieben werden kann (Exit 3), mit einer Diagnosezeile auf stderr. Erfolgreiche Läufe melden, wie viele Semantikmodelle geschrieben wurden und (falls vorhanden), welche Cubes übersprungen wurden:

ossie-export: wrote 1 semantic model(s) to pharma.ossie.yaml

Was worauf mappt

Der Exporter folgt dieser Mapping-Tabelle 1:1. Alles außer explizit gelisteten Ausnahmen landet wörtlich in der Zielspalte.

Mondrian-ElementOssie-Ausgabe
<Cube>Ein semantic_model-Eintrag
Fakten-<Table name="..." schema="..."/> des CubesErstes dataset, source: "<schema>.<table>"
<Dimension foreignKey="..."> mit <Hierarchy><Table/>Ein Dim-dataset pro Hierarchie, plus eine relationship von fact.foreignKey → dim.primaryKey
<Level name="..." column="..."/>Ein field auf dem Dim (oder Fact, bei degenerierten Dims), mit expression.dialects[0]=ANSI_SQL:column
<Level ... levelType="TimeYears"> (oder Quarters/Months/Days)Feld erhält dimension.is_time: true
<Measure name="..." column="..." aggregator="sum"/>Eine metric mit beiden ANSI_SQL (SUM(fact.column)) und MDX ([Measures].[Name])-Dialekten
<Measure aggregator="distinct-count">ANSI_SQL: COUNT(DISTINCT fact.column) — plus count, min, max, avg übersetzen alle
<CalculatedMember><Formula>...</Formula></CalculatedMember>Metrik mit nur MDX-Ausdruck (keine zuverlässige ANSI-SQL-Übersetzung für MDX-Formeln)
<Annotation name="saiku.semantic.description">ai_context.instructions des Elements
<Annotation name="saiku.semantic.synonyms">ai_context.synonyms[] des Elements (CSV-Split, getrimmt)
<Annotation name="saiku.semantic.pii">truecustom_extensions: [{vendor_name: SAIKU, data: '{"pii":true}'}] — JSON-Boolean, kein String
<Annotation name="saiku.semantic.{cardinality,grain,aggregation_kind,required_filters}">Gleiche SAIKU-Vendor-Extension, Werte als JSON-Strings serialisiert

Durchgearbeitetes Beispiel — Pharma-Cube

Eingabe-Auszug aus saiku-home/data/Pharma.xml:

<Cube name="Pharma Rx">
<Table name="fact_pharma" schema="public"/>
<Dimension name="Prescriber" foreignKey="prescriberkey">
<Hierarchy hasAll="true" primaryKey="prescriberkey">
<Table name="dim_prescriber" schema="public"/>
<Level name="Prescriber" column="prescriberkey" nameColumn="prescribername"
type="Numeric" uniqueMembers="true">
<Annotations>
<Annotation name="saiku.semantic.pii">true</Annotation>
</Annotations>
</Level>
</Hierarchy>
</Dimension>
<Measure name="Quantity" column="quantity_units" aggregator="sum" formatString="#,##0"/>
</Cube>

Produziert dieses Ossie-Fragment:

version: 0.2.0.dev0
semantic_model:
- name: Pharma Rx
datasets:
- name: fact_pharma
source: public.fact_pharma
description: Fact table for cube 'Pharma Rx'.
- name: Prescriber
source: public.dim_prescriber
primary_key:
- prescriberkey
fields:
- name: Prescriber
expression:
dialects:
- dialect: ANSI_SQL
expression: prescriberkey
custom_extensions:
- vendor_name: SAIKU
data: "{\"pii\":true}"
relationships:
- name: fact_pharma_to_Prescriber
from: fact_pharma
to: Prescriber
from_columns:
- prescriberkey
to_columns:
- prescriberkey
metrics:
- name: Quantity
expression:
dialects:
- dialect: ANSI_SQL
expression: SUM(fact_pharma.quantity_units)
- dialect: MDX
expression: "[Measures].[Quantity]"

Was (noch) nicht unterstützt wird

Der First-Cut-Konverter verarbeitet die klassische Mondrian-3–4-Hybridform, die von Pharma, Bank und den meisten Kundenschemas verwendet wird. Er verarbeitet noch nicht:

  • Mondrian-4-<MeasureGroups>- / <Dimensions>-Wrapper-Form. FoodMart verwendet diese. Cubes mit dieser Form werden übersprungen (an stderr gemeldet), statt als schema-ungültige Stubs ausgegeben zu werden. Follow-up-Arbeit wird auf dem übergeordneten Ossie/SQL-Epic verfolgt.
  • Virtuelle Cubes (<VirtualCube>) — einschließlich unseres Warehouse-and-Sales-Beispiels. Wie oben übersprungen.
  • Parent-Child-Hierarchien. Als flache Levels ausgegeben; die hierarchische Beziehung ist in Ossies aktueller dataset-orientierter Form nicht darstellbar (die Ossie-Hierarchie-Arbeitsgruppe ist in Arbeit — siehe die Ossie-Roadmap).
  • Geteilte Dimensionen, konsumiert via <DimensionUsage source=...>. Nur die klassische Per-Cube-<Dimension>-Einbettung funktioniert heute.

Wenn sich Ossies Hierarchie-Story stabilisiert (Ziel: v0.3.0+) und Saikus Mondrian-4-MG-Konverter landet, wird diese Tabelle schrumpfen.

Die Ausgabe konsumieren

Ossie-YAML wird gegen apache/ossies osi-schema.json validierungsgeprüft — jede Datei, die der Exporter produziert, durchläuft das Schema im Round-Trip mit null Findings (es gibt einen Unit-Test, der dies bei jedem Commit prüft). Nachgelagerte Konsumenten:

  • dbt — Ossies Referenzkonverter enthalten ein dbt-Modul.
  • Snowflake, Salesforce, GoodData, Polaris, Databricks — dasselbe Verzeichnis.
  • Apache Superset und Metabase — zum Zeitpunkt des Schreibens noch kein First-Party-Konverter, aber die SQL-over-Ossie-Arbeit auf der Saiku-Roadmap (übergeordnetes Epic saiku#1387) wird Saiku selbst als Semantikebene via SQL abfragbar machen.

Verwandt

  • Saiku-Semantik-Annotationen — die Annotation-Schlüssel, die der Exporter liest (die in Ossies ai_context + custom_extensions mappen).
  • Wohlbekannte Ossie-Extensions — das empfangende Ende. Sobald Ihr Schema nach Ossie-YAML exportiert, sind die saiku.display / saiku.roles / saiku.pii-Well-Knowns die Art, wie Sie Annotationen direkt dort verfassen.
  • Schemastruktur — wo der <Annotations>-Block innerhalb Ihres Mondrian-Schemas lebt.
  • apache/ossie-Repository — Upstream-Spezifikation, Konverter, Roadmap.