
本文介绍如何基于 SAP Smart Data Integration (SDI) Adapter SDK 开发 Java 自定义适配器,用于解析含类型标记(如 " 表示字符串、% 表示数字)的 .mts 文件,并将其映射为可 SQL 查询的虚拟表。
本文介绍如何基于 sap smart data integration (sdi) adapter sdk 开发 java 自定义适配器,用于解析含类型标记(如 `"` 表示字符串、`%` 表示数字)的 `.mts` 文件,并将其映射为可 sql 查询的虚拟表。
开发一个支持 .mts 文件解析的 SAP SDI 自定义适配器,核心目标是将结构化元数据(如字段名、类型标识符)转化为 SDI 可识别的虚拟表(Virtual Table),并实现按 SQL 条件动态过滤的能力。该过程并非直接读取文件后执行 JDBC 查询,而是需严格遵循 SDI Adapter SDK 的扩展规范。
1. 前置准备与架构理解
首先,明确 .mts 文件格式特征:每行代表一条记录,字段以分隔符(常见为制表符或逗号)分割,且每个值前缀标识其数据类型(例如 "Hello" 表示字符串,%123 表示数值)。适配器需在 getSchema() 方法中解析首行或元数据文件,提取字段名与类型映射;在 read() 方法中流式解析内容,结合 Filter 对象实现谓词下推(Predicate Pushdown),提升查询效率。
2. 关键开发步骤
- 环境配置:下载并导入 SAP SDI Adapter SDK,确保 JDK 8+ 与 Maven 构建支持。
-
核心类实现:继承 AbstractAdapter,重写以下方法:
- getSchema(String tableName):解析 .mts 头部或配套 .mtm 元数据文件,返回 TableSchema,其中 ColumnSchema 需根据前缀自动推断类型(" → STRING,% → DECIMAL 或 INTEGER);
- read(ReadRequest request):使用 BufferedReader 流式读取,对每一行调用 parseLine() 提取字段值,并通过 request.getFilter() 应用 SQL WHERE 条件(如 WHERE price > %100 需转换为数值比较);
- getTableList():返回所有可发现的 .mts 文件名作为虚拟表名。
3. 示例代码片段(类型解析逻辑)
private DataType inferType(String rawValue) {
if (rawValue.startsWith("\"") && rawValue.endsWith("\"")) {
return DataType.STRING;
} else if (rawValue.startsWith("%")) {
try {
Double.parseDouble(rawValue.substring(1));
return DataType.DECIMAL;
} catch (NumberFormatException e) {
return DataType.STRING; // fallback
}
}
return DataType.STRING;
}
4. 注意事项
- ❗ SDI 适配器运行于 Java 容器(如 SAP JVM),禁止使用 System.out.println 或阻塞 I/O,应通过 Logger 记录日志;
- ❗ 虚拟表 Schema 必须静态定义(不可运行时动态变更),建议将 .mts 类型规则固化为配置项或约定;
- ✅ 过滤逻辑需在 read() 中主动检查 Filter 对象的 getConditions(),避免全量加载后内存过滤;
- ✅ 部署前务必使用 adapter-tester 工具验证连接性、Schema 获取及基础查询。
完成开发后,通过 SDI 管理控制台注册适配器 JAR 包,创建远程源(Remote Source)并发布虚拟表,即可在 HANA 中执行标准 SQL(如 SELECT * FROM "MY_MTS_TABLE" WHERE "amount" > 1000)——真正实现“声明式数据访问”。











