Pentaho PDI 8.2中将未知列结构的Excel每行动态转为JSON的方法
Pentaho PDI 8.2 未知列Excel行转JSON实现方案
核心结论
- User Defined Java Class(UDJC)是你当前场景下最适合的实现方式,实现成本低、稳定性高,完全满足列数列名不固定、小数据量的要求
- PDI 8.2没有内置支持动态读取行元数据生成整行JSON的标准步骤,标准
JSON Output步骤需要设计期固定字段schema,无法适配你的需求
具体实现步骤
步骤1:配置Excel输入
使用Microsoft Excel Input步骤读取xlsx文件,按常规配置文件路径、表头行数即可,不需要固定字段配置:
- 「内容」标签页勾选表头行存在(若你的文件有表头),填写对应表头行数
- 「字段」标签页可点击「获取字段」预览当前测试文件的列,无需手动修改或固定字段,运行时会自动读取实际文件的全部列结构
步骤2:配置User Defined Java Class步骤
- 将UDJC步骤与Excel输入步骤相连
- 打开UDJC配置页,切换到「字段」标签,新增两个输出字段:
row_number:类型为Integer,存储行顺序索引json:类型为String,长度建议设置为10000以上,存储整行序列化后的JSON字符串
- 切换到「代码」标签,输入如下代码:
import org.json.JSONObject; import org.pentaho.di.core.row.RowMetaInterface; // 行计数器,成员变量会在转换运行周期内保持 private int rowCounter = 0; public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { // 获取输入行 Object[] inputRow = getRow(); // 所有行处理完成后退出 if (inputRow == null) { setOutputDone(); return false; } // 获取运行时当前行的元数据(包含所有动态字段的名称、类型信息) RowMetaInterface inputMeta = getInputRowMeta(); JSONObject jsonObj = new JSONObject(); // 遍历所有动态字段,全部转为字符串存入JSON for (int i = 0; i < inputMeta.size(); i++) { String fieldName = inputMeta.getValueMeta(i).getName(); String fieldValue = inputMeta.getString(inputRow, i); jsonObj.put(fieldName, fieldValue); } // 生成输出行 rowCounter++; Object[] outputRow = createOutputRow(inputRow, 2); // 给新增的输出字段赋值 outputRow[inputMeta.size()] = rowCounter; outputRow[inputMeta.size() + 1] = jsonObj.toString(); // 输出行到下一个步骤 putRow(data.outputRowMeta, outputRow); return true; }
步骤3:依赖补充(可选)
如果运行时提示org.json.JSONObject类不存在,可自行下载org.json的jar包放入PDI安装目录的lib文件夹下,重启PDI即可。
替代方案说明
如果不想写Java代码,也可以使用「Modified Java Script Value」步骤实现,逻辑和上述Java代码一致,1000行以内的小数据量场景下差异不大,UDJC的运行稳定性和执行效率相对更高。
内容的提问来源于stack exchange,提问作者Gorkov Aleksey
相关产品推荐
相关产品推荐

