Pentaho 数据集成转换,从 csv 文件加载字段(Java API)
Posted
技术标签:
【中文标题】Pentaho 数据集成转换,从 csv 文件加载字段(Java API)【英文标题】:Pentaho Data Integration transformation, loading fields from csv file (Java API) 【发布时间】:2015-09-18 15:49:22 【问题描述】:我正在尝试使用 Kettle Java API 创建简单的转换。
只有两个块,一个从 csv 文件读取,另一个将其写入文本文件。
代码:
PluginRegistry.addPluginType(SpoonPluginType.getInstance());
PluginRegistry.addPluginType(StepPluginType.getInstance());
PluginRegistry.init();
TransMeta transMeta = new TransMeta();
transMeta.setName("testTrans");
String csvStep = "read from file ";
CsvInputMeta csvInputMeta = new CsvInputMeta();
csvInputMeta.setDefault();
csvInputMeta.setFilename(INPUT_FILE);
csvInputMeta.setDelimiter(";");
String csvId = PluginRegistry.getInstance().getPluginId(csvInputMeta);
StepMeta stepMeta = new StepMeta(csvId, csvStep, csvInputMeta);
transMeta.addStep(stepMeta);
TextFileOutputMeta textFileOutputMeta = new TextFileOutputMeta();
textFileOutputMeta.setDefault();
textFileOutputMeta.setFilename(OUTPUT_FILE);
textFileOutputMeta.setFileFormat("txt");
String outPutStep = "Output step";
String outputId = PluginRegistry.getInstance().getPluginId(textFileOutputMeta);
StepMeta stepMeta2 = new StepMeta(outputId, outPutStep, textFileOutputMeta);
transMeta.addStep(stepMeta2);
transMeta.addTransHop(new TransHopMeta(stepMeta, stepMeta2));
transMeta.setName("testTrans");
String xml = transMeta.getXML();
DataOutputStream dos = new DataOutputStream(new FileOutputStream(new File(trans.xml)));
dos.write(xml.getBytes("UTF-8"));
dos.close();
Trans trans = new Trans(transMeta);
trans.execute(null);
trans.waitUntilFinished();
当我运行上面的代码时,输出是:
INFO 18-09 17:32:08,700 - read from file - Line number : 50000
INFO 18-09 17:32:08,703 - Output step - linenr 50000
INFO 18-09 17:32:09,147 - read from file - Line number : 100000
INFO 18-09 17:32:09,149 - Output step - linenr 100000
INFO 18-09 17:32:09,491 - read from file - Line number : 150000
INFO 18-09 17:32:09,492 - Output step - linenr 150000
INFO 18-09 17:32:09,786 - read from file - Line number : 200000
INFO 18-09 17:32:09,788 - Output step - linenr 200000
等等。 但我的 csv 文件实际上包含 4 行,看起来像这样:
id;val
1;10
2;15
3;20
问题是转换“不知道”字段是什么。 当我将转换导出为 xml 文件时,将其加载到 Pentaho Spoon 并按下“获取字段”按钮,一切正常(只读取了 3 行)。
我知道我可以手动创建这些字段并将它们设置为csvInputMeta
,但有没有办法像 Spoon 中的“获取字段”按钮一样自动执行此操作?
【问题讨论】:
我从来没有用 java 写过任何东西,但是根据 pentaho.com 上的文档,CsvInputMeta 类有一个方法 setInputFields。我在这里进行了大胆的猜测,您可能必须在读取 CSV 文件之前告诉您的 CsvInputMeta 类您期望在 CSV 文件中包含哪些字段。 【参考方案1】:如果有人好奇,我找到了解决方案。
您必须使用自己的 csv 阅读器...
但是您可以在CsvInputDialog
类(它的GUI 类)中获得一些帮助。有像getCsv
和getInfo
这样的方法,它们是私有的,所以你不能直接使用它们,但是你可以使用它们来编写你自己的方法。然后正如@Dirk 所说,使用setInputFields
方法。
或者你可以找到一些现成的 csv 解析器。
【讨论】:
以上是关于Pentaho 数据集成转换,从 csv 文件加载字段(Java API)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Pentaho勺子将数据从MySQL数据库推送到Facebook网页
在 Pentaho 中将批量 .xlsx 文件转换为 .csv (UTF-8)