与 SAP 集成

本页介绍了在 Cortex Framework Data Foundation 中集成 SAP 运营工作负载(SAP ECC 和 SAP S/4 HANA)的步骤。Cortex Framework 可以使用预定义的数据处理模板与 Dataflow 流水线搭配使用,通过 BigQuery 加速 SAP 数据与 BigQuery 的集成,同时 Cloud Composer 会调度和监控这些 Dataflow 流水线,以便从 SAP 运营数据中获取数据洞见。

Cortex Framework Data Foundation 代码库中的 config.json 文件用于配置从任何数据源(包括 SAP)传输数据所需的设置。此文件包含以下操作 SAP 工作负载的参数:

  "SAP": {
        "deployCDC": true,
        "datasets": {
            "cdc": "",
            "raw": "",
            "reporting": "REPORTING"
        },
        "SQLFlavor": "ecc",
        "mandt": "100"
    }

下表介绍了每个 SAP 操作参数的值:

参数 含义 默认值 说明
SAP.deployCDC 部署 CDC true 生成 CDC 处理脚本,以便在 Cloud Composer 中作为 DAG 运行。
SAP.datasets.raw 原始着陆页数据集 - 由 CDC 进程使用,复制工具将从 SAP 提取的数据存储在此处。如果使用测试数据,请创建一个空数据集。
SAP.datasets.cdc CDC 处理的数据集 - 数据集可用作报告视图的来源,以及记录处理 DAG 的目标。如果使用测试数据,请创建一个空数据集。
SAP.datasets.reporting 报告数据集 SAP "REPORTING" 最终用户可访问以生成报告的数据集的名称,其中部署了视图和面向用户的表。
SAP.SQLFlavor 源系统的 SQL 变种 "ecc" s4ecc。 对于测试数据,请保留默认值 (ecc)。
SAP.mandt 委托人或客户 "100" SAP 的默认客户或客户端。 对于测试数据,请保留默认值 (100)。
SAP.languages 语言过滤器 ["E","S"] 要用于相关字段(例如名称)的 SAP 语言代码 (SPRAS)。
SAP.currencies 币种过滤条件 ["USD"] 用于货币换算的 SAP 目标币种代码 (TCURR)。

虽然没有最低 SAP 版本要求,但 ECC 模型是基于当前最早支持的 SAP ECC 版本开发的。无论版本如何,我们系统与其他系统之间的字段都可能会有所不同。

数据模型

本部分介绍了使用实体关系图 (ERD) 描述的 SAP(ECC 和 S/4 HANA)数据模型。

SAP ECC

SAP ECC 的实体关系图

图 2。SAP ECC:实体关系图。

SAP S/4 HANA

SAP S/4HANA 的实体关系图

图 2。SAP S/4 HANA:实体关系图。

基本视图

这些是 ERD 中的蓝色对象,是 CDC 表上的视图,除了一些列名称别名之外,没有其他转换。请参阅 src/SAP/SAP_REPORTING 中的脚本。

报告数据视图

这些是 ERD 中的绿色对象,包含报告表格使用的相关维度属性。请参阅 src/SAP/SAP_REPORTING 中的脚本。

实用程序或 BQML 视图

这些是 ERD 中的黄色对象,包含用于数据分析和报告的已联接事实和维度特定类型的视图。在 src/SAP/SAP_REPORTING 上查看脚本。

附加标记

此 ERD 上的颜色标记代表报告表的以下功能:

代码 颜色 说明
L 黄色 此标记是指用于指定数据存储或显示语言的数据元素或属性。
S/4 红色 此标记表示特定属性仅适用于 SAP S/4 HANA(此对象可能不存在于 SAP ECC 中)。
MANDT 紫色 此标记表示特定属性包含 MANDT 参数(表示客户端或客户端 ID),用于确定特定数据记录属于哪个客户端或公司实例。
EXT 红色 此标记表示特定对象由 DAG 或外部数据集填充。这意味着,标记的实体或表不会直接存储在 SAP 系统本身中,但可以使用 DAG 或其他机制提取并加载到 SAP 中。
T 紫色 此标记表示系统将使用配置的 DAG 自动具体化特定属性。
S 红色 此标记表示实体或表格中的数据受到多种货币的影响。

SAP 复制的前提条件

  • Cortex Framework Data Foundation 希望 SAP 表的复制字段名称和类型与在 SAP 中创建的字段名称和类型相同。
  • 只要表采用与源中相同的格式、字段名称和精确度进行复制,则无需使用特定的复制工具。
  • 在 BigQuery 中创建表时,表名称必须采用小写形式。
  • SAP 模型使用的表的列表可在 CDC cdc_settings.yaml 中获取和配置。如果在部署期间未列出某个表,则依赖于该表的模型将会失败。其他模型会成功部署。
  • 如果您使用的是 BigQuery Connector for SAP,请考虑以下事项:
    • 如需了解转换选项,请参阅默认表映射文档
    • 建议停用记录压缩,因为压缩可能会以影响 Cortex CDC 层和 Cortex 报告数据集的方式更改原始 SAP 数据。
  • 如果您不打算部署测试数据,并且计划在部署期间生成 CDC DAG 脚本,请确保从源项目中的 SAP 复制 SAP 元数据表 DD03L。此表包含与表相关的元数据(例如键列表),CDC 生成器和依赖项解析器需要此表才能正常运行。您还可以通过此表添加模型未涵盖的表,以生成 CDC 脚本,例如自定义表或 Z 表。
  • 如果表名称存在细微差异,某些视图可能会因找不到字段而失败,因为 SAP 系统可能会因版本或插件而存在细微差异,并将结构附加到表中,或者某些复制工具对特殊字符的处理方式可能略有不同。建议使用 turboMode : false 执行部署,以便一次尝试就能发现大多数失败问题。例如:

    • 系统会移除以 _ 开头的字段(例如 _DATAAGING)中的 _
    • 在 BigQuery 中,字段不能以 / 开头。

    在这种情况下,您可以调整失败的视图,以便在所选复制工具将字段提取到目标位置后选择该字段。

从 SAP 复制原始数据

数据基础架构的目的是为报告和应用公开数据和分析模型。这些模型使用首选复制工具(例如适用于 SAP 的数据集成指南中列出的一些工具)来使用从 SAP 系统复制的数据。

从 SAP 系统(ECC 或 S/4 HANA)复制的数据为原始形式。数据会直接从 SAP 复制到 BigQuery,而不会对其结构进行任何更改。它本质上是 SAP 系统中表的镜像。BigQuery 为其数据模型使用小写表名称。因此,即使您的 SAP 表可能具有大写名称(例如 MANDT),它们也会在 BigQuery 中转换为小写名称(例如 mandt)。

SAP 复制的前提条件

请考虑以下使用 Cortex Framework Data Foundation 的 SAP 复制数据的前提条件

  • 数据完整性:Cortex Framework Data Foundation 预计 SAP 表的复制将使用与 SAP 中相同的字段名称、类型和数据结构。只要表的格式、字段名称和精确度与源中相同,则无需使用特定的复制工具。
  • 表命名:BigQuery 表名称必须使用小写字母创建。
  • 表配置:CDC(更改数据捕获)cdc_settings.yaml 文件中提供了 SAP 模型使用的表的列表,您可以在此文件中对其进行配置。如果在部署过程中未列出某个表,则依赖于该表的模型将会失败,但其他非依赖模型会成功部署。
  • BigQuery Connector for SAP 的具体注意事项
    • 表映射:如需了解转化选项,请参阅默认表映射文档
    • 停用记录压缩:我们建议停用 记录压缩,因为这可能会影响 Cortex CDC 层和 Cortex 报告数据集。
  • 元数据复制:如果您在部署期间未部署测试数据和生成 CDC DAG 脚本,请确保从源项目中的 SAP 复制了 SAP 元数据表 DD03L。此表包含与表相关的元数据,例如键列表,CDC 生成器和依赖项解析器需要此表才能正常运行。您还可以通过此表添加模型未涵盖的表(例如自定义表或 Z 表),以便生成 CDC 脚本。
  • 处理表名称的细微差异:如果表名称存在细微差异,某些视图可能会因找不到必需字段而失败,因为 SAP 系统可能会因版本或插件而存在细微差异,或者某些复制工具对特殊字符的处理方式可能略有不同。我们建议您使用 turboMode : false 执行部署,以便在一次尝试中发现最多的失败情况。常见的问题包括:

    • 系统会移除以 _ 开头的字段(例如 _DATAAGING)中的 _
    • 在 BigQuery 中,字段不能以 / 开头。

    在这种情况下,您可以调整失败的视图,以选择所选复制工具提取的字段。

变更数据捕获 (CDC) 处理

选择 Cortex Framework 为复制工具提供的以下 CDC 处理模式之一,以从 SAP 加载记录:

  • append-always:在记录中插入每项更改,并附带时间戳和操作标志(插入、更新、删除),以便识别上一个版本。
  • 着陆时更新(合并或更新/插入):在 change data capture processed 中着陆时创建记录的更新版本。它会在 BigQuery 中执行 CDC 操作。

Cortex Framework Data Foundation 支持这两种模式,但对于始终追加模式,它提供了 CDC 处理模板。某些功能需要注释掉,以便在着陆页上更新。例如,OneTouchOrder.sql 及其所有依赖查询。该 capability 可以替换为 CDPOS 等表。

CDC 处理

图 1。CDC 处理。

为以始终附加模式复制的工具配置 CDC 模板

我们强烈建议您根据需要配置 cdc_settings.yaml 如果企业不需要如此新鲜的数据,某些默认频率可能会导致不必要的开销。如果使用的是始终附加模式下运行的工具,Cortex Framework Data Foundation 会提供 CDC 模板来自动执行更新,并在 CDC 处理的数据集中创建最新版本的真相或数字孪生。

如果您需要生成 CDC 处理脚本,可以使用 cdc_settings.yaml 文件中的配置。如需了解相关选项,请参阅设置 CDC 处理。对于测试数据,您可以将此文件保留为默认文件。

根据您的 Airflow 或 Cloud Composer 实例,对 DAG 模板进行所有必要的更改。如需了解详情,请参阅收集 Cloud Composer 设置

可选:如果您想在部署后单独添加和处理表,可以修改 cdc_settings.yaml 文件,以便仅处理所需的表,并直接重新执行调用 src/SAP_CDC/cloudbuild.cdc.yaml 的指定模块。

设置 CDC 处理

在部署期间,您可以选择使用 BigQuery 中的视图实时合并更改,也可以在 Cloud Composer(或任何其他 Apache Airflow 实例)中安排合并操作。Cloud Composer 可以安排脚本定期处理合并操作。每次执行合并操作时,数据都会更新为最新版本,但合并操作的频率越高,成本就越高。根据业务需求自定义定期提取频率。如需了解详情,请参阅 Apache Airflow 支持的调度

以下示例脚本显示了配置文件中的摘录:

  data_to_replicate:
    - base_table: adrc
      load_frequency: "@hourly"
    - base_table: adr6
      target_table: adr6_cdc
      load_frequency: "@daily"

此配置示例文件会执行以下操作:

  1. 如果 TARGET_PROJECT_ID.DATASET_WITH_LATEST_RECORDS.adrc 不存在,则从 SOURCE_PROJECT_ID.REPLICATED_DATASET.adrc 创建一个副本并将其复制到 TARGET_PROJECT_ID.DATASET_WITH_LATEST_RECORDS.adrc
  2. 在指定存储分区中创建 CDC 脚本。
  3. 如果 TARGET_PROJECT_ID.DATASET_WITH_LATEST_RECORDS.adr6_cdc 不存在,则从 SOURCE_PROJECT_ID.REPLICATED_DATASET.adr6 创建一个副本并将其复制到 TARGET_PROJECT_ID.DATASET_WITH_LATEST_RECORDS.adr6_cdc
  4. 在指定存储分区中创建 CDC 脚本。

如果您想创建 DAG 或运行时视图来处理 SAP 中存在但未列在此文件中的表的更改,请在部署之前将这些表添加到此文件中。只要表 DD03L 复制到源数据集中,并且自定义表的架构存在于该表中,这种方法便可正常运行。例如,以下配置会为自定义表 zztable_customer 创建 CDC 脚本,并创建一个运行时视图,以便实时扫描名为 zzspecial_table 的另一个自定义表的更改:

    - base_table: zztable_customer
      load_frequency: "@daily"
    - base_table: zzspecial_table
      load_frequency: "RUNTIME"

生成的模板示例

以下模板会生成更改处理。此时可以进行修改,例如修改时间戳字段的名称或执行其他操作:

  MERGE `${target_table}` T
  USING (
     SELECT *
     FROM `${base_table}`
     WHERE
        recordstamp > (
            SELECT IF(
                MAX(recordstamp) IS NOT NULL,
                MAX(recordstamp),
                TIMESTAMP("1940-12-25 05:30:00+00"))
            FROM `${target_table}` )
  ) S
  ON ${p_key}
  WHEN MATCHED AND S.operation_flag='D' AND S.is_deleted = true THEN
    DELETE
  WHEN NOT MATCHED AND S.operation_flag='I' THEN
    INSERT (${fields})
    VALUES
    (${fields})
  WHEN MATCHED AND S.operation_flag='U' THEN
  UPDATE SET
      ${update_fields}

或者,如果您的业务需要近乎实时的分析洞见,并且复制工具支持,则部署工具接受选项 RUNTIME。这意味着系统不会生成 CDC 脚本。而是会在运行时扫描并提取最新的可用记录,以实现即时一致性

CDC DAG 和脚本的目录结构

SAP CDC DAG 的 Cloud Storage 存储分区结构要求在 /data/bq_data_replication 中生成 SQL 文件,如以下示例所示。您可以在部署前修改此路径。如果您还没有 Cloud Composer 环境,可以稍后创建一个,然后将文件移至 DAG 存储分区。

with airflow.DAG("CDC_BigQuery_${base table}",
                template_searchpath=['/home/airflow/gcs/data/bq_data_replication/'], ##example
                default_args=default_dag_args,
                schedule_interval="${load_frequency}") as dag:
    start_task = DummyOperator(task_id="start")
    copy_records = BigQueryOperator(
      task_id='merge_query_records',
        sql="${query_file}",
        create_disposition='CREATE_IF_NEEDED',
        bigquery_conn_id="sap_cdc_bq", ## example
        use_legacy_sql=False)
    stop_task = DummyOperator (task_id="stop")
    start_task >> copy_records >> stop_task

在 Airflow 或 Cloud Composer 中处理数据的脚本是专门与 Airflow 专用脚本分开生成的。这样,您就可以将这些脚本移植到其他所选工具。

MERGE 操作所需的 CDC 字段

指定以下参数以自动生成 CDC 批处理:

  • 源项目 + 数据集:用于流式传输或复制 SAP 数据的数据集。默认情况下,为了让 CDC 脚本正常运行,表需要包含一个时间戳字段(称为 recordstamp)和一个操作字段,其中包含以下值,这些值均在复制期间设置:
    • I:用于插入。
    • U:表示更新。
    • D:表示删除。
  • CDC 处理的目标项目 + 数据集:默认情况下,生成的脚本会根据源数据集的副本生成表(如果不存在)。
  • 复制表:需要为其生成脚本的表
  • 处理频率:按照 Cron 表示法,DAG 的预期运行频率:
  • 用于复制 CDC 输出文件的目标 Cloud Storage 存储分区
  • 连接的名称:Cloud Composer 使用的连接的名称。
  • (可选)目标表的名称:如果 CDC 处理结果保留在与目标表相同的数据集中,则可用。

优化了 CDC 表的性能

对于某些 CDC 数据集,您可能需要利用 BigQuery 表分区和/或表集群。此选择取决于以下因素:

  • 表的大小和数据。
  • 表格中可用的列。
  • 需要包含视图的实时数据。
  • 以表格形式具体化的数据。

默认情况下,CDC 设置不会应用表分区或表聚类。您可以根据自己的需求来配置它。如需创建包含分区或集群的表,请使用相关配置更新 cdc_settings.yaml 文件。如需了解详情,请参阅表分区集群设置

  1. 只有在 cdc_settings.yaml 中的数据集配置为以表的形式(例如 load_frequency = "@daily")进行复制,而不是定义为视图 (load_frequency = "RUNTIME") 时,此功能才适用。
  2. 表既可以是分区表,也可以是聚簇表。

如果您使用的复制工具允许在原始数据集中创建分区(例如 BigQuery Connector for SAP),建议您在原始表中设置基于时间的分区。如果分区类型与 cdc_settings.yaml 配置中的 CDC DAG 频率匹配,则效果会更好。如需了解详情,请参阅 BigQuery 中 SAP 数据建模的设计注意事项

可选:配置 SAP 库存模块

Cortex Framework SAP 目录模块包含 InventoryKeyMetricsInventoryByPlant 视图,可提供有关商品目录的关键数据洞见。这些视图由使用专用 DAG 的月度和每周快照表提供支持。这两种广告系列可以同时投放,且不会相互干扰。

如需更新任一或两个快照表,请按以下步骤操作:

  1. 更新 SlowMovingThreshold.sqlStockCharacteristicsConfig.sql,根据您的要求为不同材料类型定义滞销阈值和库存特性。

  2. 对于初始加载或完整刷新,请运行 Stock_Monthly_Snapshots_InitialStock_Weekly_Snapshots_Initial DAG。

  3. 对于后续刷新,请安排或运行以下 DAG:

    • 每月和每周更新:
      • Stock_Monthly_Snapshots_Periodical_Update
      • Stock_Weekly_Snapshots_periodical_Update
    • 每日更新:
      • Stock_Monthly_Snapshots_Daily_Update
      • Stock_Weekly_Snapshots_Update_Daily
  4. 刷新中间 StockMonthlySnapshotsStockWeeklySnapshots 视图,然后依次刷新 InventoryKeyMetricsInventoryByPlants 视图,以显示刷新后的数据。

可选:配置“商品层次结构文本”视图

“产品层次结构文本”视图会展开材料及其产品层次结构。生成的表可用于向 Trends 插件提供字词列表,以检索一段时间内的兴趣。请按照以下步骤配置此视图:

  1. prod_hierarchy_texts.sql 文件中,调整 ## CORTEX-CUSTOMER 标记下的层次结构级别和语言。
  2. 如果您的商品层次结构包含更多层级,您可能需要添加类似于常规表表达式 h1_h2_h3 的其他 SELECT 语句。

    可能还需要进行其他自定义,具体取决于来源系统。我们建议您在流程的早期就让业务用户或分析师参与进来,以帮助发现这些问题。

可选:配置层次结构扁平化视图

从版本 v6.0 开始,Cortex Framework 支持将层次结构扁平化为报告视图。与旧版层次结构扁平化工具相比,这是一个重大改进,因为它现在会扁平化整个层次结构,通过使用 S/4 专用表(而非旧版 ECC 表)更好地针对 S/4 进行优化,并且还会显著提升性能。

报告视图摘要

查找与层次结构扁平化相关的以下视图:

层次结构类型 仅包含扁平化层次结构的表 用于可视化扁平化层次结构的视图 使用此层次结构的损益表集成逻辑
财务报表版本 (FSV) fsv_glaccounts FSVHierarchyFlattened ProfitAndLossOverview
利润中心 profit_centers ProfitCenterHierarchyFlattened ProfitAndLossOverview_ProfitCenterHierarchy
成本中心 cost_centers CostCenterHierarchyFlattened ProfitAndLossOverview_CostCenterHierarchy

使用层次结构扁平化视图时,请考虑以下事项:

  • 仅包含扁平化层次结构的视图在功能上等同于旧版层次结构扁平化解决方案生成的表。
  • 默认情况下,系统不会部署概览视图,因为它们仅用于展示 BI 逻辑。在 src/SAP/SAP_REPORTING 目录下找到它们的源代码。

配置层次结构扁平化

根据您使用的层次结构,以下输入参数是必需的:

层次结构类型 必需参数 Source 字段 (ECC) “来源”字段 (S4)
财务报表版本 (FSV) 账户图 ktopl nodecls
层次结构名称 versn hryid
利润中心 集合的类 setclass setclass
组织部门:组的控制区域或其他键。 subclass subclass
成本中心 集合的类 setclass setclass
组织部门:组的控制区域或其他键。 subclass subclass

如果您不确定确切参数,请咨询财务或控制 SAP 顾问。

收集参数后,请根据您的要求更新每个相应目录中的 ## CORTEX-CUSTOMER 注释:

层次结构类型 代码位置
财务报表版本 (FSV) src/SAP/SAP_REPORTING/local_k9/fsv_hierarchy
利润中心 src/SAP/SAP_REPORTING/local_k9/profitcenter_hierarchy
成本中心 src/SAP/SAP_REPORTING/local_k9/costcenter_hierarchy

如果适用,请务必在 src/SAP/SAP_REPORTING 目录下的相关报告视图中正确更新 ## CORTEX-CUSTOMER 评论。

解决方案详情

以下源表用于扁平化层次结构:

层次结构类型 来源表 (ECC) 来源表 (S4)
财务报表版本 (FSV)
  • fagl_011pc
  • fagl_011zc
  • ska1
  • hrrp_node
  • hrrp_directory
  • ska1
利润中心
  • setheader
  • setnode
  • setleaf
  • sethanahier0106
成本中心
  • setheader
  • setnode
  • setleaf
  • sethanahier0101

直观呈现层次结构

Cortex 的 SAP 层次结构扁平化解决方案可扁平化整个层次结构。如果您想创建一个与 SAP 在界面中显示的内容相当的已加载层次结构的可视化表示,请使用 IsLeafNode=True 条件查询用于可视化扁平化层次结构的视图之一。

从旧版层次结构扁平化解决方案迁移

如需从Cortex v6.0 之前的旧版层次结构扁平化解决方案迁移,请按下表所示替换表格。请务必检查字段名称是否准确,因为有些字段名称已略有修改。例如,cepc_hier 中的 prctr 现在是 profit_centers 表中的 profitcenter

层次结构类型 替换此表格 参与者
财务报表版本 (FSV) ska1_hier fsv_glaccounts
利润中心 cepc_hier profit_centers
成本中心 csks_hier cost_centers

可选:配置 SAP 财务模块

Cortex Framework SAP 财务模块包含 FinancialStatementBalanceSheetProfitAndLoss 视图,可提供关键财务数据洞见。

如需更新这些财务表,请按以下步骤操作:

对于初始加载

  1. 部署完成后,请确保 CDC 数据集已正确填充(根据需要运行任何 CDC DAG)。
  2. 确保层次结构展平视图已针对您使用的层次结构类型(FSV、成本中心和利润中心)正确配置。
  3. 运行 financial_statement_initial_load DAG。

  4. 如果以表格形式部署(推荐),请运行相应的 DAG 以按顺序刷新以下内容:

    1. Financial_Statements
    2. BalanceSheets
    3. ProfitAndLoss

定期刷新

  1. 确保针对您使用的层次结构类型(FSV、成本中心和利润中心)正确配置层次结构展平视图,并将其更新为最新版本。
  2. 安排或运行 financial_statement_periodical_load DAG。

  3. 如果以表格形式部署(推荐),请运行相应的 DAG 以按顺序刷新以下内容:

    1. Financial_Statements
    2. BalanceSheets
    3. ProfitAndLoss

如需直观呈现这些表中的数据,请参阅以下“概览”视图:

  • 如果您使用的是 FSV 层次结构,则为 ProfitAndLossOverview.sql
  • ProfitAndLossOverview_CostCenter.sql(如果您使用的是成本中心层次结构)。
  • ProfitAndLossOverview_ProfitCenter.sql(如果您使用的是利润中心层次结构)。

后续步骤