
本文介绍如何基于 SAP Smart Data Integration (SDI) Adapter SDK 开发 Java 自定义适配器,用于解析带类型标记(如 " 表示字符串、% 表示数字)的 .mts 元数据文件,并动态生成可 SQL 查询的虚拟表。
本文介绍如何基于 sap smart data integration (sdi) adapter sdk 开发 java 自定义适配器,用于解析带类型标记(如 `"` 表示字符串、`%` 表示数字)的 `.mts` 元数据文件,并动态生成可 sql 查询的虚拟表。
SAP Smart Data Integration(SDI)允许通过自定义适配器接入非标准数据源。针对 .mts 这类结构化元数据文本文件(每行以类型前缀标识字段,例如 "name" 表示字符串型列、%age 表示数值型列),需构建符合 SDI 规范的 Java 适配器,实现元数据自动识别、虚拟表注册与条件化数据过滤。
核心开发步骤
-
环境准备
- 安装 SAP HANA Studio 或 SAP Business Application Studio(支持 SDI 开发)
- 配置 JDK 8/11、Maven 及 SDI Adapter SDK(需从 SAP Support Portal 下载对应版本)
- 在 pom.xml 中引入关键依赖:
<dependency><groupid>com.sap.hana.sdi</groupid><artifactid>sdi-adapter-sdk</artifactid><version>2.0.0</version><scope>provided</scope></dependency>
-
实现核心接口
适配器必须实现 com.sap.hana.sdi.adapter.Adapter 接口,并重点覆盖以下方法:- getMetadata():解析 .mts 文件,提取字段名、类型(根据 " → STRING、% → DECIMAL 等映射)、长度等,构造 TableMetadata 对象;
- getData(ReadRequest):根据 SQL 的 WHERE 条件(由 ReadRequest.getFilter() 提供),逐行解析 .mts 内容,执行类型安全的字符串匹配或数值比较;
- getSupportedCapabilities():返回 Capability.FILTERING,声明支持谓词下推。
-
.mts 解析示例逻辑
假设 data.mts 内容如下:"id" %score "region" "101" %95.5 "EMEA" "102" %87.2 "APAC"
在 getMetadata() 中可按行解析首行:
List<columnmetadata> columns = new ArrayList(); String[] headers = firstLine.split("\s+"); for (String h : headers) { if (h.startsWith(""")) columns.add(new ColumnMetadata(h.substring(1, h.length()-1), DataType.STRING)); else if (h.startsWith("%")) columns.add(new ColumnMetadata(h.substring(1), DataType.DECIMAL)); }</columnmetadata> -
注意事项
- 所有 I/O 操作(如读取 .mts 文件)必须通过 SDI 提供的 ResourceAccessor 获取路径,禁止硬编码本地路径;
- 字段名需严格区分大小写,且不能含空格或特殊字符(建议在解析时做标准化处理);
- 过滤逻辑需兼容 SDI 的 FilterExpression 抽象语法树(AST),推荐使用 FilterVisitor 实现递归遍历而非正则硬匹配;
- 调试阶段务必启用 SDI 日志(logging.properties 设置 com.sap.hana.sdi.adapter.level=DEBUG),观察元数据加载与查询执行流程。
完成开发后,使用 mvn clean package 构建 JAR,通过 SDI 管理界面上传并绑定至远程源(Remote Source),即可在 HANA 中执行类似 SELECT * FROM "MY_MTS_ADAPTER"."data" WHERE score > 90 的查询——所有过滤均在适配器层完成,避免全量数据拉取。
该方案将原始文本协议转化为标准 SQL 数据源,是 SDI 扩展能力的典型实践,适用于日志元数据、IoT 设备描述文件等轻量级结构化文本集成场景。











