使用 ODP 上下文 - 基于 CDS 视图的抽取

学习目标

  • 使用 ODP 和 CDS View 抽取器从 S/4HANA 中抽取数据

基于 ODP_CDS 的 SAP S/4HANA 抽取

从本地或云端的 SAP S/4HANA 抽取数据

将数据从 SAP S/4HANA 抽取到 SAP BW/4HANA 的新的 SAP 标准方法基于 SAP ABAP 核心数据服务(CDS)技术。它取代了 S-API 技术。

首批基于 CDS 的 DataSource 随 SAP S/4HANA 1809 本地部署版本一同交付。

SAP S/4HANA Cloud 使用基于 HTTP/SOAP 的连接,而不是基于 RFC 的方式连接到 SAP BW/4HANA。因此,ODP_SAP 不适用于此场景,ODP_CDS 是从 SAP S/4HANA Cloud 进行 SAP BW/4HANA 抽取的通用战略性核心接口。SAP BW/4HANA 与 S/4HANA Cloud 之间的技术框架与连接(基于 HTTP / SOAP,即所谓的通信场景)自 S/4HANA Cloud 1808 起可用。自 1811 版本起,S/4HANA Cloud 中已存在第一批用于抽取的 ABAP CDS 内容,以及用于扩展性的第一版关键用户工具。从 SAP S/4HANA Cloud 1905 开始,SAP 已开始逐步推出对已启用标准 CDS 视图的抽取,并自那以后持续扩大覆盖范围。

ABAP CDS 视图作为 ODP 提供者(上下文 ODP_CDS)

ABAP CDS 视图的 ODP 上下文(ABAP_CDS)提供了通过 RFC 或基于 HTTP 的连接方式连接到 SAP BW/4HANA 的选项。通过 ODP 框架提供 CDS 抽取器的 SAP 源系统必须至少满足以下版本级别之一:SAP NW 7.4 SP08、SAP NW 7.5 SP02、SAP BW/4HANA 1.0。

要通过注解释放一个 CDS 实体用于抽取,需要定义两项特性:

  • CDS 实体的类型: 有两个注解可用于定义对象表示的是事务性数据、属性、文本还是层次结构。它们是 ANALYTICS.DATACATEGORY 以及 OBJECTMODEL.DATACATEGORY 。

  • 抽取类型: 注解 ANALYTICS.DATAEXTRACTION.ENABLED 提供所需的属性,并指示系统生成所谓的运营数据提供者,以便为 SAP BW/4HANA 建模 ODP_CDS DataSource。如果需要,还可使用其他注解来指定增量机制,除非仅支持全量抽取。

以下注解使 ABAP CDS 视图可用于全量抽取(以及通过 Open ODS View 进行虚拟访问):

  • @Analytics.dataCategory(#DIMENSION, #FACT or #CUBE) @ObjectModel.dataCategory(#TEXT or #HIERARCHY) 并且

  • @Analytics.dataExtraction.enabled

对于增量抽取,可使用以下附加注解集:

  • @Analytics.dataExtraction.delta.byElement.(…) 用于基于日期/时间戳的增量(自 SAP S/4HANA 2018 起可用)

  • @Analytics.DataExtraction.Delta.ChangeDataCapture.(…) 用于基于 CDC 的增量(自 SAP S/4HANA 2019 起可用)

注意

我们将在本课稍后更详细地介绍使用全量抽取和增量抽取的场景。

在运行时,会为每个 ABAP CDS 视图生成一个 TransientProvider。TransientProvider 从 ABAP CDS 视图生成 SAP BW/4HANA 元数据,以便其能够被 SAP BW/4HANA 处理。

事务码 RSRTS_ODP_DIS 用于显示运营数据提供者的 TransientProvider 预览。

该工具显示运行时使用的 TransientProvider 的元数据。这些 CDS 实体需要在相应的数据类别注解中指定为事实、主数据、文本或层次结构。您可以检查元数据并预览生成的数据。此外,还可以获取所有字段(特征和关键指标)及其全部属性的概览。它是分析 CDS 视图的有用工具。

要获取 ABAP CDS 视图的 SQL View 名称到 ABAP DDIC 视图的映射,可以使用表 RSODPABAPCDSVIEW

比较经典抽取与 CDS 抽取

让我们比较一下客户过去如何使用基于经典 ABAP 函数模块、采用较旧 S-API 技术的抽取器,以及基于 SAP ABAP 核心数据服务的新技术。

与无法用于测试基于 CDS 的抽取器的事务码 RSA3 不同,报表 RODPS_REPL_TEST 用于测试 ODP 复制。

请注意顶部的警告(Warning: Not Simulated):使用该报表初始化增量和/或运行增量抽取,会在 ODQ 框架中触发真实的订阅。这不是模拟运行。

ODP 名称@AbapCatalog.sqlViewName,并按以下方式附加 CDS 实体的数据类别分类后缀:

  • $F 表示事实/事务数据

  • $P 表示主数据属性

  • $T 表示文本

  • $H 表示层次结构

  • $E 表示其他/无数据类别

CDS 视图使用标准 ODP 队列及相关的监控工具(ODQMON)。如果增量由 CDC 管理,还可使用额外的 CDC 监控器(DHCDCMON)。

启动下一个演示,探索用于抽取的 ABAP CDS 视图:

注意

有关 SAP S/4HANA 中新 CDS 抽取器的更多详细信息,请参阅以下博客文章:

https://community.sap.com/t5/technology-blogs-by-sap/finding-the-right-cds-extractor-in-sap-s-4hana/ba-p/13521296

探索用于抽取的 ABAP CDS 视图

演示观看演示(SAP 官方交互式练习)

使用 ODP_CDS 进行全量与增量抽取

使用 ODP_CDS 的场景

ODP_CDS 可用于多种场景。让我们来看看以下场景:

  • 全量模式下的 CDS 抽取(无增量能力)

  • 基于日期/时间戳的 CDS 增量抽取(BW 管理)

  • 基于日期/时间戳的 CDS 增量抽取(ODP 管理)

  • 基于变更数据捕获(CDC)的 CDS 增量抽取

全量模式下的 CDS 抽取(无增量能力)

在上图中,该 CDS 实体通过 @Analytics.dataCategory: #CUBE 定义,表示 SAP BW/4HANA OLAP 统计的事务数据。此外,抽取通过 @Analytics.dataExtraction.enabled:true 启用。基于这些属性,可向 SAP BW/4HANA 系统执行全量抽取。

基于日期/时间戳的 CDS 增量抽取(BW 管理)

即使 CDS 对象中未定义与增量相关的注解,也可以选择设置一种由 SAP BW/4HANA 应用管理的增量机制:与 DTP 中的过滤器类似,SAP BW/4HANA 在源系统中处理 CDS 视图时会实现一个本地 WHERE 条件,以选择紧接上次抽取之后的时间区间。如果您在 SAP BW/4HANA DataSource 中将某个日期定义为增量字段(其他选项为时间戳或数字指针),则给定的一天只能被抽取一次,并且在常规加载期间您应只收集已结束的日期(例如,当前日期 -1,即截至昨天)。

一般而言,您应谨慎使用这种由 BW 管理的增量,仅在需要增量但无法在 CDS 实体本身中定义时才使用(例如,在您的组织中您无权更改任何现有 CDS 实体或创建自己的 CDS 实体)。首选方式是改用由 ODP 管理的增量实现,本课其余部分将对此进行介绍。

基于日期/时间戳的 CDS 增量抽取(ODP 管理)

基于日期/时间戳的增量有时也称为通用增量,其概念与过去的经典 ABAP 抽取器类似。CDS 中的通用增量自 SAP S/4HANA 1809 本地部署版本起可用,它依赖于 CDS 视图中存在一个反映底层记录更改的日期/时间元素。您可以将以下字段类型用作增量条件:

  • 日期(ABAP 类型 DATS)

  • UTC 时间戳

利用时间戳是增量抽取的首选方式。如果应用程序表/CDS 视图中没有合适的时间戳,也可以改用日期字段作为替代方案。应仅使用持久化的时间戳或日期字段,出于性能方面的考虑,不建议在运行时进行虚拟派生。时间戳或日期字段为空的记录,仅在 DTP 模式 "Delta Init with data" 下抽取时才会被抽取。

以下注解定义了此增量方法的详细信息:

  • @Analytics.dataExtraction.delta.byElement.name:应用程序开发者可使用此注解启用通用增量抽取。该元素定义在通用增量抽取期间用于过滤的字段。

  • @Analytics.dataExtraction.delta.byElement.maxDelayInSeconds:获取 UTC 时间戳与数据库提交之间总是存在时间延迟。此注解以秒为单位指定可能的最大延迟。如果不添加此注解,则应用 1800 秒(即半小时)的默认延迟。

  • @Analytics.dataExtraction.delta.byElement.detectDeletedRecords:通过使用此注解,系统会将所有被抽取的记录键组合存储在单独的数据存储中。为识别删除,在每次抽取运行期间,都会将该数据存储中的所有记录与 CDS View 中仍然可用的所有记录进行比较。视图中不再可用的记录将作为删除发送给消费客户端。换句话说,如果某个键组合不再出现在视图中,这将在抽取数据中自动生成一条删除镜像。

注意

毋庸置疑,此概念仅适用于数据量较低的场景(约 < 1,000,000 条数据记录),不应将其用于高数据量的应用因此,此机制主要适用于小型主数据和文本抽取。还可使用另一个注解来缩短用于删除比较的记录所考虑的时间范围。这意味着您有一个回溯限制,只有落入该时间范围内的已抽取记录集才会与 CDS 视图中当前可用的记录进行比较。

  • @Analytics.dataExtraction.delta.byElement.ignoreDeletionAfterDays:参照前一个注解,如果已删除的记录早于指定的天数,抽取将忽略这些记录(例如,出于归档目的)。

使用增量字段,ODP 框架可确定数据消费者已抽取到哪条记录。在后续抽取请求中,仅收集日期/时间戳更高的记录用于抽取。

在由流式处理流程链进行实时增量订阅的情况下,实时守护进程默认大约每 15 秒检查一次 CDS 视图中的新记录。对于非实时增量订阅,符合增量条件的新记录会在抽取期间直接从 CDS 视图中拉取。

作为一种保护措施,可以指定一个安全间隔。这可以容纳诸如等待应用系统端数据库提交之类的技术延迟。时间戳落入该时间安全间隔的记录将被从 CDS 视图中选取两次:一次在抽取运行 1 中,一次在抽取运行 2 中。ODP 框架会存储属于该安全间隔的所有记录的键数据和哈希值,以便找出已更改的记录。在抽取运行 1 中,属于时间间隔(抽取运行 1 的开始时间戳 – maxDelayInseconds)的记录将被存储起来,以供后续比较。

在随后的抽取运行 2 中,属于该时间间隔的记录将再次被选取,并与抽取运行 1 中先前保存的记录/哈希值进行比较。只有属于该安全间隔且哈希值发生变化的记录才会被再次抽取,以反映目标系统中的更改。先前已抽取但在安全间隔内未发生更改的记录,将不会被再次抽取。

使用到目前为止介绍的注解,您将获得新创建的记录以及对现有记录的更新,但不会获得删除。注解 @Analytics.dataExtraction.delta.byElement.detectDeletions 使视图能够在通用增量机制中检测已删除的记录。包含此注解会将所有被抽取的记录键组合存储在单独的数据存储中。为识别删除,在每次抽取运行期间,都会将该数据存储中的所有记录与 CDS 视图中仍然可用的所有记录进行比较。视图中不再可用的记录将作为删除发送给消费客户端。

基于变更数据捕获(CDC)的 CDS 增量抽取

从 SAP S/4HANA Cloud 1905 或本地部署的 SAP S/4HANA 1909 FP01(基于 SAP NetWeaver 7.54)开始,SAP 引入了另一种利用数据库触发器的增量能力。这第二种增量方法名为变更数据捕获(CDC)。对于使用此增量方法的 CDS 视图,属于该视图的表的更改由变更数据捕获机制记录。从技术角度看,此增量方法基于 SLT 技术(= SAP LT Replication Server)利用表级别的实时数据库触发器。数据库级别(而非应用级别!)的 SQL INSERT、UPDATE 和 DELETE 操作由 CDC 框架记录。为正常运行,所有底层表的关键字段都需要作为 CDS 视图的元素公开,并进行相应的映射。

该框架记录已更改表行的关键字段值。在 INSERT 或 UPDATE 操作的情况下,计划作业会根据这些键组合从 CDS 视图中选择记录,并将它们作为完整记录推送到运营增量队列(ODQ)中。在 DELETE 操作的情况下,该作业会生成一条仅填充了关键字段的空记录,设置删除标识,并将其移交给 ODQ。

使用 CDC 增量方法公开 CDS 视图的主要任务是,提供 CDS 视图字段与底层表关键字段之间的映射信息。该映射对于为每个底层表启用全面的日志记录,并随后一致地选择/(重新)构造要提供给抽取的记录是必需的。这意味着框架需要知道要记录(即监控记录更改)哪些表。鉴于一条记录可能仅在某一个底层表中发生更改,框架需要确定在其他所有底层表中哪些记录受此更改影响,并需要向 ODQ 提供一致的增量记录集。

以下注解定义了此增量方法的详细信息:

  • @Analytics.dataExtraction.delta.changeDataCapture:定义使用基于数据库触发器的变更数据捕获(CDC)增量机制。

  • @Analytics.dataExtraction.delta.changeDataCapture.automatic:设置 CDC 的简单情形是针对单个表的投影 CDS 视图。在这种情况下,框架可以自行推导 CDS 视图字段与底层表关键字段之间的关系。每当底层表中插入、更新或删除一条记录时,都会在生成的日志表中存储一条带有相应表键的记录。基于此信息,计划作业从 CDS 视图中选择数据记录并将其推送到 ODQ 中。

  • @Analytics.dataExtraction.delta.changeDataCapture.mapping:当底层 CDS 模型包含更多数据库表时,设置 CDC 会更加复杂。对于更复杂的 CDS 视图(例如使用联接的视图),需要提供映射信息。使用此注解,您可以定义 CDS 视图中公开的元素与底层表关键字段的映射。

注意

一般而言,只有那些应触发增量的表才应添加到 CDC 映射注解中。例如,在面向销售订单的新 CDS 抽取器(C_SALESDOCUMENTITEMDEX_1)中,与公司代码表(T001)以及销售组织表(TVKO)的映射存在(与之前的 C_SALESDOCUMENTITEMDEX 相比已不再存在),因为您不希望这些表中的更改触发与特定公司代码或销售组织相关的所有销售数据的增量(另请参阅 SAP 注释 3070845)。

  • @Analytics.dataExtraction.delta.changeDataCapture.mapping.role:抽取视图的键与要记录的底层主表的键完全对应。主表获得值 #MAIN。CDS 视图的键与要记录的底层主表的键完全对应。外部表获得值 #LEFT_OUTER_TO_ONE_JOIN。目前 CDC 仅支持与一个主表进行左外一对一联接。

  • @Analytics.dataExtraction.delta.changeDataCapture.mapping.table:指定要记录的表的名称。

  • @Analytics.dataExtraction.delta.changeDataCapture.mapping.viewElement:映射到 CDS 视图键元素的表关键字段列表。

  • @Analytics.dataExtraction.delta.changeDataCapture.mapping.tableElement:抽取视图的键与要记录的底层物理主表的键完全对应。

  • @Analytics.dataExtraction.delta.changeDataCapture.mapping.filter:如果未对 CDS 视图应用任何限制,则 CDS 视图的记录数即构成主表的记录数。主表中的所有记录在 CDS 视图中都可见。此注解允许为 CDS 视图在要记录的表上定义过滤器,前提是该过滤器是单个值,并且可以替代视图元素与表元素之间缺失的映射。

当您消费提供 CDC 增量的 ODP_CDS DataSource 时,值得关注的细节位于 SAP BW/4HANA 中 DataSource 定义的抽取 / 增量过程选项卡上:它已启用增量,并提供(覆盖)后映像,这使 SAP BW/4HANA 端的数据传输易于处理。在运营数据提供者下,您还可以看到在 CDS 视图中通过注解 @AbapCatalog.technicalSQLView 指定的名称。

关于此 CDS 视图的记录删除,仅在主表中的记录被删除时才会发生。

出于技术原因,所有指向联接中使用的相应外部表的外键字段,都需要在 CDS 视图中作为字段公开。如果其中某些字段不打算供最终用户消费,可以通过注解 @Consumption.hidden 隐藏。

您可以使用事务码 DHCDCMON 启动 CDC 监控。该工具提供已为变更数据捕获(CDC)注册的增量过程、内部 SLT 作业和 ODP 作业,以及订阅和表的概览,其中包括一些有用的专家功能(清理控制表、检查或取消订阅主/从日志表及相关数据库触发器、删除记录对象)。您还可以使用报表 IUUC_LIST_TRIGGERS 列出数据库触发器;控制表 DHCDC_RECCONTROL 存储应用程序表到日志表的映射。

提示

有关 CDC 增量的更多详细信息,请参阅此 SAP 博客系列:第 II 部分 Delta Handling https://community.sap.com/t5/enterprise-resource-planning-blogs-by-sap/cds-based-data-extraction-part-ii-delta-handling/ba-p/13425761

本课其余配图

S4HANA ODP_CDS_LJ

ODP_CDS_LJ

ODP_CDS Tool_Image_LJ

ODP_CDS Tool3_image_LJ

CDS_vs_SAPI_LJ

ODP_CDS Tool2_image_LJ

S4HANA_GENDELTA2_LJ

ODP_CDS_BWManDelta_LJ

S4HANA_GENDELTA_LJ

S4HANA_GENDELTA3_LJ

S4HANA ODP_CDS_CDC_LJ

S4HANA ODP_CDS_CDC2_LJ

ODP_CDS Tool4_image_LJ

本课其余配图

S4HANA ODP_CDS_LJ

ODP_CDS Tool_Image_LJ

ODP_CDS Tool3_image_LJ

ODP_CDS Tool2_image_LJ

S4HANA ODP_CDS_CDC_LJ

S4HANA ODP_CDS_CDC2_LJ

ODP_CDS Tool4_image_LJ

本课其余配图

S4HANA ODP_CDS_LJ

ODP_CDS Tool_Image_LJ

ODP_CDS Tool3_image_LJ

ODP_CDS Tool2_image_LJ

S4HANA ODP_CDS_CDC_LJ

S4HANA ODP_CDS_CDC2_LJ

ODP_CDS Tool4_image_LJ

本课其余配图

S4HANA ODP_CDS_LJ

ODP_CDS Tool_Image_LJ

ODP_CDS Tool3_image_LJ

ODP_CDS Tool2_image_LJ

S4HANA ODP_CDS_CDC_LJ

S4HANA ODP_CDS_CDC2_LJ

ODP_CDS Tool4_image_LJ