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:
java -jar saiku-launcher/target/saiku-4.6.0.jar ossie-export \ --in saiku-home/data/Pharma.xml \ --out pharma.ossie.yamlOder verwenden Sie stdin/stdout für Scripting:
cat schema.xml | saiku ossie-export > schema.ossie.yamlDer 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.yamlWas worauf mappt
Der Exporter folgt dieser Mapping-Tabelle 1:1. Alles außer explizit gelisteten Ausnahmen landet wörtlich in der Zielspalte.
| Mondrian-Element | Ossie-Ausgabe |
|---|---|
<Cube> | Ein semantic_model-Eintrag |
Fakten-<Table name="..." schema="..."/> des Cubes | Erstes 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">true | custom_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.dev0semantic_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_extensionsmappen). - 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.