SAP Datasphere ist die Nachfolgelösung von SAP Data Warehouse Cloud und bildet das Herzstück der SAP Business Data Fabric. Für ABAP Cloud Entwickler eröffnet sich damit die Möglichkeit, transaktionale Daten für komplexe Analytics-Szenarien bereitzustellen.
SAP Datasphere Grundlagen
SAP Datasphere vereint Data Warehousing, Data Lake, Data Virtualization und Business Semantics in einer integrierten Plattform. Die Architektur basiert auf Spaces, die als isolierte Datenbereiche fungieren.
Kernkonzepte
| Konzept | Beschreibung |
|---|---|
| Space | Isolierter Arbeitsbereich für Teams |
| Data Builder | Modellierung von Views und Tabellen |
| Business Builder | Semantische Layer und Kennzahlen |
| Data Access Controls | Berechtigungen auf Datenebene |
| Connections | Anbindungen an Quellsysteme |
Integration mit ABAP Cloud
ABAP Cloud Systeme lassen sich über verschiedene Wege anbinden:
- ABAP CDS Extraction: Direkte Extraktion von CDS Views
- OData Services: Zugriff über OData-Schnittstellen
- Remote Tables: Virtueller Zugriff auf SAP-Systeme
- Replication Flows: Geplante Datenreplikation
CDS View Extraction für Datasphere
Die CDS View Extraction ist der empfohlene Weg für ABAP Cloud zu Datasphere. Die Views müssen mit speziellen Annotationen versehen werden.
Extraction-fähige CDS Views
@AbapCatalog.sqlViewName: 'ZSALESORDEREX'@AbapCatalog.compiler.compareFilter: true@Analytics.dataCategory: #CUBE@Analytics.dataExtraction.enabled: true@Analytics.dataExtraction.delta.changeDataCapture.automatic: truedefine view entity ZI_SalesOrderExtract as select from zsalesorder as so association [1..1] to ZI_CustomerMaster as _Customer on $projection.CustomerId = _Customer.CustomerId{ @Analytics.dataExtraction.delta.byElement.name: 'ChangedOn' @Analytics.dataExtraction.delta.byElement.maxDelayInSeconds: 1800 key so.sales_order_id as SalesOrderId,
so.customer_id as CustomerId, so.order_date as OrderDate, so.net_amount as NetAmount, so.currency as Currency, so.status as Status,
@Semantics.systemDateTime.lastChangedAt: true so.changed_on as ChangedOn,
@Semantics.systemDateTime.createdAt: true so.created_on as CreatedOn,
_Customer}Wichtige Annotationen für Extraktion
| Annotation | Beschreibung |
|---|---|
@Analytics.dataExtraction.enabled | Aktiviert die Extraktion |
@Analytics.dataExtraction.delta.changeDataCapture.automatic | Automatische CDC |
@Analytics.dataExtraction.delta.byElement.name | Feld für Delta-Erkennung |
@Analytics.dataCategory | Kategorisierung (#CUBE, #DIMENSION, #FACT) |
Analytische CDS Views für Datasphere
Für optimale Analytik sollten CDS Views nach dem Star-Schema modelliert werden.
Dimension View (Kunde)
@AbapCatalog.viewEnhancementCategory: [#NONE]@Analytics.dataCategory: #DIMENSION@Analytics.dataExtraction.enabled: true@ObjectModel.representativeKey: 'CustomerId'define view entity ZI_CustomerDimension as select from zcustomer{ key customer_id as CustomerId,
@Semantics.text: true customer_name as CustomerName,
country as Country, region as Region, city as City, customer_type as CustomerType,
@Semantics.businessDate.createdAt: true created_on as CreatedOn}Fact View (Umsätze)
@AbapCatalog.viewEnhancementCategory: [#NONE]@Analytics.dataCategory: #FACT@Analytics.dataExtraction.enabled: true@Analytics.dataExtraction.delta.changeDataCapture.automatic: truedefine view entity ZI_SalesFactExtract as select from zsales_data as sd association [1..1] to ZI_CustomerDimension as _Customer on $projection.CustomerId = _Customer.CustomerId association [1..1] to ZI_ProductDimension as _Product on $projection.ProductId = _Product.ProductId association [1..1] to ZI_TimeDimension as _Time on $projection.SalesDate = _Time.CalendarDate{ key sd.sales_id as SalesId,
sd.customer_id as CustomerId, sd.product_id as ProductId, sd.sales_date as SalesDate,
@Semantics.amount.currencyCode: 'Currency' @DefaultAggregation: #SUM sd.revenue as Revenue,
@DefaultAggregation: #SUM sd.quantity as Quantity,
@DefaultAggregation: #SUM sd.discount as Discount,
sd.currency as Currency,
@Semantics.systemDateTime.lastChangedAt: true sd.changed_at as ChangedAt,
_Customer, _Product, _Time}Cube View (Aggregation)
@AbapCatalog.viewEnhancementCategory: [#NONE]@Analytics.dataCategory: #CUBE@Analytics.dataExtraction.enabled: truedefine view entity ZI_SalesAnalyticsCube as select from ZI_SalesFactExtract as Fact association [1..1] to ZI_CustomerDimension as _Customer on $projection.CustomerId = _Customer.CustomerId association [1..1] to ZI_ProductDimension as _Product on $projection.ProductId = _Product.ProductId{ key Fact.SalesId,
-- Dimensionen @ObjectModel.foreignKey.association: '_Customer' Fact.CustomerId,
@ObjectModel.foreignKey.association: '_Product' Fact.ProductId,
@AnalyticsDetails.query.axis: #ROWS Fact.SalesDate,
-- Kennzahlen @AnalyticsDetails.query.axis: #COLUMNS @Aggregation.default: #SUM Fact.Revenue,
@Aggregation.default: #SUM Fact.Quantity,
@Aggregation.default: #AVG Fact.Discount,
Fact.Currency,
-- Assoziationen _Customer, _Product}Delta-Extraktion konfigurieren
Die Delta-Extraktion überträgt nur geänderte Daten nach dem initialen Load. Dies spart Ressourcen und reduziert Latenzen.
Zeitstempel-basierte Delta-Extraktion
@Analytics.dataExtraction.enabled: true@Analytics.dataExtraction.delta.byElement: { name: 'ChangedAt', maxDelayInSeconds: 3600, ignoreDeletions: false}define view entity ZI_MaterialWithDelta as select from zmaterial{ key material_id as MaterialId, material_name as MaterialName, base_unit as BaseUnit, material_type as MaterialType,
@Semantics.systemDateTime.lastChangedAt: true changed_at as ChangedAt,
deletion_flag as DeletionFlag}Change Data Capture (CDC)
Für Echtzeit-nahe Replikation kann automatisches CDC aktiviert werden:
@Analytics.dataExtraction.enabled: true@Analytics.dataExtraction.delta.changeDataCapture: { automatic: true, rowStatus: 'DELTA_STATUS'}define view entity ZI_OrderWithCDC as select from zorder association [0..*] to ZI_OrderItemWithCDC as _Items on $projection.OrderId = _Items.OrderId{ key order_id as OrderId, customer_id as CustomerId, order_date as OrderDate, order_status as OrderStatus,
@Semantics.systemDateTime.lastChangedAt: true changed_at as ChangedAt,
-- CDC-Statusfeld delta_status as DeltaStatus,
_Items}CDC-Feldwerte
| Wert | Bedeutung |
|---|---|
' ' (leer) | Unverändert |
'U' | Update |
'I' | Insert |
'D' | Delete |
Komplexes Delta-Szenario
@Analytics.dataExtraction.enabled: true@Analytics.dataExtraction.delta.changeDataCapture.automatic: truedefine view entity ZI_InvoiceExtract as select from zinvoice as inv inner join zcustomer as cust on inv.customer_id = cust.customer_id{ key inv.invoice_id as InvoiceId, inv.customer_id as CustomerId, cust.customer_name as CustomerName, inv.invoice_date as InvoiceDate, inv.total_amount as TotalAmount, inv.currency as Currency, inv.payment_status as PaymentStatus,
-- Delta-Felder @Semantics.systemDateTime.lastChangedAt: true case when inv.changed_at > cust.changed_at then inv.changed_at else cust.changed_at end as ChangedAt,
-- Berechnetes Löschkennzeichen case when inv.deletion_flag = 'X' or cust.deletion_flag = 'X' then 'X' else '' end as DeletionIndicator}Berechtigungen für Extraktion
Die Extraktion erfordert spezielle Berechtigungen sowohl im ABAP-System als auch in Datasphere.
ABAP-seitige Berechtigungen
CLASS zcl_datasphere_auth DEFINITION PUBLIC CREATE PUBLIC.
PUBLIC SECTION. INTERFACES if_badi_interface.
METHODS check_extraction_auth IMPORTING iv_view_name TYPE sxco_cds_object_name RETURNING VALUE(rv_authorized) TYPE abap_bool.
ENDCLASS.
CLASS zcl_datasphere_auth IMPLEMENTATION.
METHOD check_extraction_auth. " Prüfung auf Extraktionsberechtigung DATA: lv_auth_check TYPE abap_bool.
" Berechtigungsobjekt prüfen AUTHORITY-CHECK OBJECT 'Z_DS_EXTR' ID 'Z_VIEWNAME' FIELD iv_view_name ID 'ACTVT' FIELD '03'. " Anzeigen
IF sy-subrc = 0. rv_authorized = abap_true. ELSE. rv_authorized = abap_false. ENDIF. ENDMETHOD.
ENDCLASS.Berechtigungsobjekt Definition
" Berechtigungsobjekt Z_DS_EXTR für Datasphere Extraktion" Felder:" - Z_VIEWNAME: Name des CDS Views (CHAR 40)" - ACTVT: Aktivität (01=Erstellen, 02=Ändern, 03=Anzeigen)CDS Views mit Berechtigungsprüfung
@AccessControl.authorizationCheck: #CHECK@Analytics.dataExtraction.enabled: truedefine view entity ZI_ConfidentialSalesData as select from zsales_data{ key sales_id as SalesId, customer_id as CustomerId, region as Region, revenue as Revenue, profit_margin as ProfitMargin, currency as Currency, changed_at as ChangedAt}Zugehörige DCL (Data Control Language)
@EndUserText.label: 'Vertriebsdaten Berechtigung'@MappingRole: truedefine role ZI_ConfidentialSalesData { grant select on ZI_ConfidentialSalesData where ( Region ) = aspect pfcg_auth( Z_SD_REGN, Z_REGION, ACTVT = '03' );}Technical User für Extraktion
Für die automatische Extraktion wird ein technischer Benutzer benötigt:
CLASS zcl_datasphere_extraction_user DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION. CLASS-METHODS get_technical_user RETURNING VALUE(rv_user) TYPE syuname.
CLASS-METHODS validate_technical_user IMPORTING iv_user TYPE syuname RETURNING VALUE(rv_valid) TYPE abap_bool.
ENDCLASS.
CLASS zcl_datasphere_extraction_user IMPLEMENTATION.
METHOD get_technical_user. " Technischer User für Datasphere Extraktion rv_user = 'DATASPHERE_EXTRACT'. ENDMETHOD.
METHOD validate_technical_user. " Prüfung ob User existiert und aktiv ist SELECT SINGLE bname FROM usr02 WHERE bname = @iv_user AND uflag = 0 " Nicht gesperrt INTO @DATA(lv_user).
rv_valid = xsdbool( sy-subrc = 0 ). ENDMETHOD.
ENDCLASS.Live Data Connection vs. Replication
SAP Datasphere bietet zwei grundlegende Integrationsmodi, die jeweils unterschiedliche Anwendungsfälle abdecken.
Live Data Connection (Virtualization)
Bei der Live Data Connection werden Daten nicht kopiert, sondern zur Laufzeit direkt aus dem Quellsystem abgerufen.
Vorteile:
- Immer aktuelle Daten
- Kein zusätzlicher Speicherverbrauch
- Keine Replikationslogik erforderlich
Nachteile:
- Höhere Latenz bei Abfragen
- Belastung des Quellsystems
- Eingeschränkte Transformationsmöglichkeiten
Anwendungsfälle:
- Stammdaten mit geringem Änderungsvolumen
- Ad-hoc Abfragen
- Prototyping und Exploration
Replication (Materialization)
Bei der Replikation werden Daten physisch nach Datasphere kopiert und dort persistiert.
Vorteile:
- Hohe Abfrageperformance
- Keine Belastung des Quellsystems
- Komplexe Transformationen möglich
- Historisierung möglich
Nachteile:
- Daten nicht in Echtzeit
- Zusätzlicher Speicherverbrauch
- Replikationslogik erforderlich
Anwendungsfälle:
- Bewegungsdaten mit hohem Volumen
- Komplexe analytische Abfragen
- Reporting mit definierten Refresh-Zyklen
Entscheidungsmatrix
| Kriterium | Live Data | Replication |
|---|---|---|
| Datenaktualität | Echtzeit | Verzögert (Minuten bis Stunden) |
| Performance | Mittel | Hoch |
| Quellsystem-Last | Hoch | Niedrig |
| Datenvolumen | Klein bis mittel | Beliebig |
| Transformationen | Eingeschränkt | Umfangreich |
Hybrides Szenario
-- Stammdaten: Live Connection (immer aktuell)@Analytics.dataExtraction.enabled: true@Analytics.dataExtraction.preferredMode: #VIRTUALdefine view entity ZI_CustomerMasterLive as select from zcustomer{ key customer_id as CustomerId, customer_name as CustomerName, customer_type as CustomerType, credit_limit as CreditLimit, currency as Currency}
-- Bewegungsdaten: Replikation (hohe Performance)@Analytics.dataExtraction.enabled: true@Analytics.dataExtraction.preferredMode: #REPLICATED@Analytics.dataExtraction.delta.changeDataCapture.automatic: truedefine view entity ZI_SalesHistoryReplicated as select from zsales_history{ key sales_id as SalesId, customer_id as CustomerId, sales_date as SalesDate, amount as Amount, currency as Currency, changed_at as ChangedAt}Konfiguration in Datasphere
Connection Setup
Im Datasphere Data Builder wird die Verbindung zum ABAP-System konfiguriert:
- Connection Type: SAP ABAP
- System ID: Systemidentifikation (z.B. S4P)
- Host: Hostname des ABAP-Systems
- Client: Mandant
- User/Password: Technischer Benutzer
Remote Table Configuration
Remote Table Settings:- Source Object: ZI_SalesFactExtract- Load Type: Initial + Delta- Delta Frequency: Every 15 minutes- Memory: Large- Partitioning: By SalesDate (Monthly)Data Flow Definition
Für komplexe Transformationen können Data Flows definiert werden:
Source: ZI_SalesFactExtract (Remote Table) → Filter: SalesDate >= '20240101' → Aggregation: SUM(Revenue) GROUP BY CustomerId, Month → Enrichment: LEFT JOIN CustomerMaster → Target: Sales_Monthly_Summary (Local Table)Performance-Optimierung
CDS View Design für Extraktion
-- Optimiert für Extraktion@AbapCatalog.sqlViewAppendage: { forSourceViewName: 'ZSALESOPT'}@Analytics.dataExtraction.enabled: true@Analytics.dataExtraction.delta.byElement.name: 'ChangedAt'define view entity ZI_SalesOptimized as select from zsales{ key sales_id as SalesId,
-- Partitionierungsschlüssel früh @Analytics.dataExtraction.partitionBy: true sales_date as SalesDate,
-- Filterbare Felder indiziert @Analytics.dataExtraction.filter: #RECOMMENDED region as Region,
customer_id as CustomerId, amount as Amount, currency as Currency,
@Semantics.systemDateTime.lastChangedAt: true changed_at as ChangedAt}Batch-Größen und Parallelisierung
CLASS zcl_extraction_config DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION. CONSTANTS: c_batch_size TYPE i VALUE 50000, c_max_parallel_jobs TYPE i VALUE 4, c_delta_interval TYPE i VALUE 900. " 15 Minuten
CLASS-METHODS get_extraction_params IMPORTING iv_view_name TYPE sxco_cds_object_name RETURNING VALUE(rs_params) TYPE zcl_extraction_config=>ts_params.
TYPES: BEGIN OF ts_params, batch_size TYPE i, parallel_jobs TYPE i, delta_interval TYPE i, use_compression TYPE abap_bool, END OF ts_params.
ENDCLASS.
CLASS zcl_extraction_config IMPLEMENTATION.
METHOD get_extraction_params. " View-spezifische Konfiguration rs_params = VALUE #( batch_size = c_batch_size parallel_jobs = c_max_parallel_jobs delta_interval = c_delta_interval use_compression = abap_true ).
" Anpassung für große Views IF iv_view_name CS 'HISTORY' OR iv_view_name CS 'ARCHIVE'. rs_params-batch_size = 100000. rs_params-parallel_jobs = 8. ENDIF. ENDMETHOD.
ENDCLASS.Monitoring und Troubleshooting
Extraktion überwachen
CLASS zcl_extraction_monitor DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION. METHODS get_extraction_status IMPORTING iv_view_name TYPE sxco_cds_object_name RETURNING VALUE(rs_status) TYPE zcl_extraction_monitor=>ts_status.
TYPES: BEGIN OF ts_status, view_name TYPE sxco_cds_object_name, last_run TYPE timestampl, records_total TYPE i, records_delta TYPE i, runtime_ms TYPE i, status TYPE c LENGTH 10, error_message TYPE string, END OF ts_status.
ENDCLASS.
CLASS zcl_extraction_monitor IMPLEMENTATION.
METHOD get_extraction_status. " Beispielhafte Statusabfrage SELECT SINGLE * FROM zextraction_log WHERE view_name = @iv_view_name ORDER BY timestamp DESCENDING INTO @DATA(ls_log).
IF sy-subrc = 0. rs_status = VALUE #( view_name = ls_log-view_name last_run = ls_log-timestamp records_total = ls_log-records_total records_delta = ls_log-records_delta runtime_ms = ls_log-runtime_ms status = ls_log-status error_message = ls_log-error_message ). ENDIF. ENDMETHOD.
ENDCLASS.Häufige Fehler
| Fehler | Ursache | Lösung |
|---|---|---|
| No extraction enabled | Annotation fehlt | @Analytics.dataExtraction.enabled: true hinzufügen |
| Delta field not found | Falsches Feldname | Feldname in byElement.name prüfen |
| Authorization failed | Fehlende Berechtigung | Technischen User berechtigen |
| Timeout during extraction | Zu große Datenmenge | Batch-Größe reduzieren |
Best Practices
- Modellierung nach Star-Schema: Fact- und Dimension-Views klar trennen
- Delta immer aktivieren: Reduziert Last und Transfervolumen
- Berechtigungen granular definieren: Nur notwendige Daten exponieren
- Performance testen: Vor Go-Live Extraktionszeiten messen
- Monitoring einrichten: Fehlerhafte Extraktionen frühzeitig erkennen
- Dokumentation pflegen: Views und deren Verwendung dokumentieren
Zusammenfassung
| Aspekt | Empfehlung |
|---|---|
| Stammdaten | Live Data Connection |
| Bewegungsdaten | Replication mit Delta |
| Berechtigungen | DCL + PFCG kombinieren |
| Performance | Partitionierung + Indizes |
| Monitoring | Regelmäßige Statusprüfung |
Die Integration von ABAP Cloud mit SAP Datasphere eröffnet mächtige Analytics-Möglichkeiten. Mit den richtigen Annotationen, Delta-Strategien und Berechtigungskonzepten lässt sich eine robuste und performante Datenversorgung realisieren.
Verwandte Themen
- CDS Views Grundlagen - Grundlagen der Core Data Services
- Custom Analytical Queries - Analytische Abfragen in ABAP Cloud
- CDS Annotations - Alle CDS Annotationen im Überblick
- ABAP SQL Neuerungen - Aktuelle SQL-Features in ABAP