跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

这是您第一次登陆到 developerWorks,已经自动为您创建了您的概要文件。 选择您概要文件中可以公开的信息的信息(如姓名、国家/地区,以及公司),这些信息同时也会与您所发布的内容相关联。 您可以随时更新您的 IBM 账号。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

在 IBM InfoSphere Information Server 中使用 DataStage Java Integration Stage 和 Java Pack 从 Excel 源文件中提取数据

分步指南

简介: 探讨 IBM® InfoSphere® Information Server 9.1 中引入的 Java™ Integration Stage (DataStage Connector) 功能。本文将使用 Java Pack Plug-ins 和 Java Pack API 解决旧版 IBM InfoSphere Information Server(7.5.x、8.0.x、8.1.x、8.5.x 和 8.7.x)的 Excel 数据源连通性问题。旧版 Information Server 没有提供专用组件来处理 Excel 连接性问题。第三方 ODBC to ODBC 桥可作为一个备选方案使用,但是它们需要授权。可以使用 Java Pack Stages 以及 Java Pack API 和 Apache POI API,以某一种具有成本效益的方式将 Excel 数据提取到 DataStage 中。

发布日期: 2013 年 8 月 19 日
级别: 中级 原创语言: 英文
访问情况 : 289 次浏览
评论: 


简介

IBM InfoSphere Information 服务器由一套可帮助企业从遍布多个数据源系统的信息中获取业务价值的数据集成产品组成。它有助于以某种具有成本效益的方式从多个异构数据源中分析、清理和集成信息。有了 IBM InfoSphere Information Server,企业能够以较低的成本和风险提高其运营效率。

IBM Information Server DataStage 是一个 ETL 产品,可帮助组织提取、转换和加载来自异构数据源的数据。DataStage 可使用其高性能并行框架通过集成各种数据源来解决复杂的业务问题。

DataStage Java Integration Stage 和 DataStage Java Pack plug-ins

Java Integration Stage 是一个 DataStage Connector,可以使用它从 InfoSphere Data Stage 和 Quality Stage 并行任务中调用一个自定义 Java 应用程序。Java Integration Stage 在 IBM InfoSphere Information Server 9.1 或更高版本中提供。Java Integration Stage 可用于以下拓扑结构中:作为一个源、作为一个目标、作为一个转换器、作为一个查找阶段。关于 Java Integration Stage 的更多信息,请参阅 参考资料

DataStage Java Pack 是两个插件阶段(Java Transformer 和 Java Client)的集合,可以通过它来调用 DataStage 中的 Java 应用程序。Java Pack 在 DataStage 7.5.x 或更高版本中提供。

Java Transformer 阶段是一个主动阶段,用于调用一个 Java 应用程序,该应用程序可读取输入数据并对其进行转换 ,然后将其写入 DataStage 作业中定义的输出链接。Java Client 阶段是一个被动阶段,可作为一个源、一个目标以及一个查找阶段使用。作为目标阶段使用时,Java Client Stage 将使用数据。作为一个查找阶段时,Java Client Stage 将执行查找功能。

关于 Java Pack Stages 的更多信息,请参阅 参考资料

您可以使用 Java Integration Stage(Unstructured Data Stage)或者任何 Java Pack Stages 来提取 Excel 数据。具体情况取决于部署的 Information Server 版本。如果您使用的是 Information Server 9.1,那么可以使用 Unstructured Data Stage 或 Java Integration Stage 来提取 Excel 数据。如果您使用的是 9.1 之前的版本(比如,8.7.x、8.5.x、8.1.x、8.0.1 和 7.5.x),则必须使用 Java Pack Stages(Java Transformer Stage 或 Java Client Stage)从 Excel 文件中提取数据。本文将介绍如何使用 Java Integration Stage 和 Java Pack Client Stage 来提取 Excel 数据。


DataStage Java Integration Stage 和 Java Client Stage GUI 属性

Java Integration Stage GUI

Java Integration Stage 和 Java Client Stage 在 DataStage Designer Palette 的 Real Time 阶段提供。要使用 Java Integration Stage 和 Java Pack Stages,需要启动 DataStage Designer,创建一个新作业,扩展 Palette 中的 Real Time Stages 类别,然后拖拽该阶段。


图 1. Palette 中的 Java Integration Stage 和 Java Pack Stages
Pallete 窗口中的方框圈起来的是 Java Client 和 Jsva Transformer

Java Integration 阶段根据不同的使用环境(源、目标和查找)支持不同的属性。必须配置阶段属性来定义 Java 虚拟机配置以及从 Java Integration 阶段调用的 Java 类。输入链接和输出链接属性必须根据作业设计进行配置。


图 2. 阶段属性
Java Integration 窗口的属性选项卡
  • Stage 名称包含用户定义的 Stage 名称。
  • Description 包含 Stage 描述。
  • Java 包含 JVM 属性。
  • Classpath 包含 Java 类路径。使用分号 “;” 作为路径分隔符。
  • Heap size (MB) 包含堆栈大小(以 MB 为单位),这对应于 -Xmx 命令行选项,最小允许值为 128。默认值为 256。
  • Optional JVM 选项包含 Java Virtual Machine 命令行选项。
  • User 类包含从 Stage 运行的 Java 类名称。
  • 使用用户定义函数确定是否使用了用户定义函数或 Java Integration 阶段类的实现。
  • 用户函数包含阶段将要调用的 Java Class 方法。
  • 自定义属性包含在运行时传递给 Java Class 的自定义阶段属性。

图 3. 输出属性
Java Integration 窗口中的输出选项卡

使用 Properties 选项卡中的属性将 Java Integration Stage 配置为一个源。Properties 选项卡仅对输出链接可用,对拒绝链接不可用。

  • 自定义属性指定了在运行时传递给用户类的自定义阶段属性。
  • 是否为拒绝链接(兼容性)指出流链接是否为拒绝链接。仅用在运行 Java Transformer 代码时。默认值为 NO。
  • 列映射指出了 DataStage 列和 bean 属性之间的映射。该属性是通过 Column Mapping Editor 窗口设置的。
  • JavaBeans 类指出了与该链接相关的 JavaBeans 类。该属性是通过 Column Mapping Editor 窗口设置的。

Java Pack Client Stage GUI


图 4. Java Client Stage 属性
JClientPX 阶段窗口中的 Stage 属性
  • Transformer Class Name 包含阶段运行的类名。
  • 用户的类路径包含 Java 类路径,使用一个分号 “;” 作为路径分割符。
  • Description 包含阶段描述。

图 5. Java Client Stage User Properties
JClientPX 阶段窗口中的属性选项卡
  • 用户的属性包含在运行时传递给 Java 类的用户属性。

图 6. Java Client Stage Options
ClientPX 阶段窗口中的选项选项卡

可在 Option 字段指定不同的 JVM 选项。


Java Integration Stage 和 Java Pack API

Java Integration Stage 和 Java Pack Stages 允许外部 Java 应用程序通过公开 API 来访问 DataStage 和 Quality Stage。外部 Java 应用程序必须使用 Java Integration API 进行开发,以便获取对 DataStage 和 Quality Stage 的访问。

  • Java Integration Stage API:com.ibm.is.cc.javastage.api.Processor 的一个子类。该子类作为 ccjava-api.jar 文件的一部分提供。
  • Java Pack API:com.ascentialsoftware.jds.Stage 的一个子类。该子类作为 tr4j.jar 文件的一部分提供。

在本文中,tr4j.jar API 用于开发 Java 应用程序。使用 tr4j.jar API 开发的 Java 应用程序可从 Java Integration Stage 或 Java Client Stage 中调用。

使用 Java Pack API 开发一个 Java 应用程序

您的 Java 程序必须实现 Stage 类的一个子类,这将作为 tr4j.jar 文件的一部分提供。Stage 类由几个操作行和查询元数据的方法构成。Stage 类是您作业中所有实现 Java Client 或 Java Transformer 阶段的类的根源。

  • 覆盖 Stage.initialize() 方法来定义初始化逻辑。
  • 覆盖 Stage.process() 方法来定义处理逻辑。
  • 覆盖 Stage.terminate() 方法来定义终止逻辑。

intialize()terminate() 方法是可选的,清单 1 展示了一个使用 Java Pack API 开发的简单 Java 类的框架。在 process() 方法中读取和处理一个输入行,并生成一个输出行。


清单 1. 使用 Java Integration API 的 Java Application 的框架
				
public class Mytransformer extends Stage 
{ 
	public void initialize() 
	{ 
	// ...initialization logic 
	} 
	public void terminate() 
	{ 
	// ...termination logic 
	} 
				
	//The core processing logic of the Java application.
	public int process() 
	{	 
	// ...process input row... 
	Row inputRow = readRow(); 
	
	// ...fill output row... 
	Row outputRow = createOutputRow(); 
	writeRow(outputRow); 
	return OUTPUT_STATUS_READY; 
	} 
}
            


Apache POI API

Apache POI 是 Apache Software Foundation 运行的一个项目,Apache Software Foundation 用于开发 Java 应用程序,以便以 Microsoft™ Office 格式(比如,Word、Power Point 和 Excel)读取和写入文件。可以使用 POI API 开发基于 Office Open XML (ooxml) 的文件格式的 Java 端口。Apache POI 发布版作为多个 jar 文件的一部分为各种文档文件模型提供支持。POI-HSSF 和 POI-XSSF 是访问 Microsoft Excel 文档的 Java API。HSSF 是 POI Project 的 Excel (97-2007) 文件格式的纯 Java 实现,而 XSSF 是 Excel 2007 OOXML (.xlsx) 文件格式的纯 Java 实现。HSSF 和 XSSF 提供了一些方法来创建、修改、读取和写入 Excel 电子表格。 简言之,要读取 .xsl 文件,则需要使用 HSSF API,要读取 .xlsx 文件,则需要使用 XSSF API。 在本文中,您将使用 HSSF API 从 .xsl 文档中提取数据。关于 Apache POI 的更多信息,请访问 Apache 官方网站(参阅 参考资料)。

使用 HSSF API 读取 Excel 文档

要在一个文件中进行读操作,需要创建一个新的 org.apache.poi.poifs.Filesystem 实例,将一个开源 InputStream(比如 XSL 的 FileInputStream)传入构造函数。构造一个新的 org.apache.poi.hssf.usermodel.HSSFWorkbook 实例,将 Filesystem 实例传递给构造函数。从那里您可以通过其访问方法(workbook.getSheet(sheetNum)sheet.getRow(rownum) 等等)访问所有高级模型对象。

需要导入以下数据包来使用 Excel 文档:

  • org.apache.poi.hssf.usermodel.HSSFWorkbook 是工作薄对象的一个高层表示。这是在工作簿上执行读取和写入操作所需的原始对象。这是创建表单对象所需的顶级对象。
  • org.apache.poi.hssf.usermodel.HSSFSheet 是一个工作簿的工作表对象的高层表示。
  • org.apache.poi.hssf.usermodel.HSSFRow 是一个工作簿的行对象的高层表示。
  • org.apache.poi.hssf.usermodel.HSSFCell 是一个工作簿的一个行的单元格对象的高层表示。单元格类型指出了单元格内容是否为数字、字符串或公式等等。单元格内容转换逻辑留给用户应用程序来实现。

使用 Java Integration API 和 Apache POI HSSF API 的 Excel 应用程序

要在 DataStage 中读取 Excel 数据,必须结合使用 DataStage Java Integration API 和 Apache POI HSSF API 开发一个 Java 应用程序。Java Integration Stage API 充当了外部 Java Application 和 DataStage 之间的集成点。Apache POI HSSF API 充当了 Excel 数据源和 Java 应用程序之间的集成点。下面简要介绍了输入 Java Application 方法的代码是什么:

initialize() 方法

这是一个标准 Java Pack API 方法。所有初始化逻辑都在这里。以下对象将在这里初始化。

  • FileInputStream 对象,读取输入 Excel 文件。
  • HSSFWorkbook 对象,保存 Excel 工作薄对象。
  • HSSFSheet 对象,包含工作薄的表单对象。
  • HSSFFormulaEvaluator 对象是使用单元格公式进行工作所必需的,如果有的话。本例没有使用这些公式。

清单 2. intialize() 方法
				
public void initialize()
{
	//Java Pack API Logging method to log messages to Director Log.
	info("*****Initializing Excel Application*****"); 
		
	//Code block to initalize and read user property values provided in the Stage GUI.
	byte[] userProperties 		= getUserProperties().getBytes();
	InputStream propertyStream 	= new ByteArrayInputStream(userProperties);
	Properties properties 		= new Properties();
	
	try
	{
		properties.load(propertyStream);  //User properties loaded.
	}
	
	//Log a message if user properties cannot be loaded.
	catch(IOException e)
	{
		info("*****Could not load user properties");
	} 	
	
	//Read the value of the user property named ExcelFileName
	String propertyValue 	= properties.getProperty("ExcelFileName" ); 		
	
	//Code block to create the objects of 
	//the File input stream,workbook and sheet.
	try 
	{
		FileInputStream fis		=new FileInputStream(propertyValue);
		workbook			=new HSSFWorkbook(fis);
		formulaEval			=new HSSFFormulaEvaluator(workbook);
	
	//Get the first sheet object
	sheet					=workbook.getSheetAt(0);
	
	//Create a row iterator for the sheet  
		rows				=sheet.rowIterator(); 
	}	 
	catch (FileNotFoundException e) 
	{
		//Log a message if the input excel file is not found
		info("The input Excel file is not found"); 
	}
	catch(IOException ioExp)
	{
		//Log the IO Exception
		info("*****IO Exception*****"); 
	}	
	catch(org.apache.poi.hssf.OldExcelFormatException UnsupportedExcelFormatException)
	{
		//Log a message if the Excel format is not supported.
		info("*****Cannot read old Excel format*****"); 
	}		
}


process() 方法

这是一个标准的 Java Pack API 方法。核心处理逻辑位于其中,从 Excel 文档中提取数据的逻辑也在这里定义。该方法首先检查表单中是否包含一些行。如果有的话,则使用 createOutputRow() 方法创建一个输出行对象。对现有单元格的每个行进行检查,并使用一个单元格迭代器在整个单元格中进行迭代。单元格值通过用户定义方法 extractCellValue() 提取。提取的单元格值使用 outputRow.setValueAsString() 方法赋值给数据行对象。最后使用 writeRow() 方法将输出行写入 DataStage 作业输出链接中。


清单 3. process() 方法
				
public int process()
{ 
	//If rows exist
	if(rows.hasNext())								
	{
		int colCount		= 0;
			
		//Create an output row object to hold the row data
		Row outputRow 		= createOutputRow(); 		
			
		//Create an Excel row object
		HSSFRow hrow 		= (HSSFRow) rows.next();	
			
		//Create a cell iterator for the row
		Iterator<Cell> cells 	= hrow.cellIterator();	
			
		//If cells exist
		while (cells.hasNext())						
		{
			HSSFCell hcell 	= (HSSFCell) cells.next();
				
			//Extract cell value
			String cellData = extractCellValue(hcell,hcell.getCellType());	
				
			//Assign the row data to the outout row object
			outputRow.setValueAsString(colCount,cellData);		
			colCount++;
		}
		info("*****Writing Excel data to Target*****");			
		//Write the row to the output link in the job
		writeRow(outputRow);
		return OUTPUT_STATUS_READY;				
	}
		return OUTPUT_STATUS_END_OF_DATA;
}


extractCellValue() 方法

这是一个用户定义方法,由 process() 方法调用。一个 Excel 文件可能包含不同的数据类型值,比如字符串、布尔值和整数。因此,必须根据数据类型来提取单元格值。extractCellValue() 方法根据类型返回单元格内容。它检查每个单元的类型,并将其内容返回到 process() 方法,该方法通常将数据写入输出行。


清单 4. extractCellValue() 方法
				
protected String extractCellValue(HSSFCell cell, int hcellType)
{
	String cell_value;
	formatter = new DataFormatter();
	switch (hcellType) 					
	{
		//If Cell is blank
		case HSSFCell.CELL_TYPE_BLANK:	
		cell_value = "";
		break;
			
		//If Cell value is boolean
		case HSSFCell.CELL_TYPE_BOOLEAN:
		cell_value = "" + cell.getBooleanCellValue();
		break;
			
		//If Cell value is string
		case HSSFCell.CELL_TYPE_STRING:
		cell_value = cell.getRichStringCellValue().toString();
		break;
			
		//Invalid cell
		case HSSFCell.CELL_TYPE_ERROR:		
		cell_value = "ERROR";
		break;
			
		//If Cell value is numeric
		case HSSFCell.CELL_TYPE_NUMERIC:
		cell_value = formatter.formatCellValue(cell, formulaEval);
		break;
			
		//Default Cell value
		default:							
		cell_value = "DEFAULT_VALUE";
		break;
		}
	return cell_value;
}		


terminate() 方法

这是一个标准的 Java Pack API 方法。在完成核心处理时,通过 Java Integration Stage 对该方法进行调用。


清单 5. terminate() 方法
				
public void terminate()
{
	// Log information message while terminating the Application.	
	info("*****Terminating Excel Application*****");
}


注意:该示例只使用了简单数据类型。您可以使用 Apache POI API 对该函数进行扩展,以便使用复杂的类型,甚至公式。该示例还假设在 Excel 文档中只有一个表单,但现实中通常有很多表单。Apache POI API 提供了一些函数来使用多个表单。探索 Apache POI API,了解更多受支持的函数。


从 DataStage 中调用 Excel 应用程序

在完成 Excel Java 应用程序开发后,必须通过在 Java 类路径中保存的 DataStage tr4j.jar 和 Apache poiXX.jar 文件来进行编译。生成的 Java 类文件必须在 DataStage 作业中使用,以便提取 Excel 数据,并将其转换成另一种格式(比如,关系型数据)。

DataStage 作业设计

从 Real Time Packs 面板中拖放 Java Integration Stage 或 Java Client Stage,并创建一个到达目标 Stage 的输出链接。在本例中,目标阶段是一个 Sequential File Stage。作业设计如图 7 和图 8 所示。


图 7. 作业设计使用 Java Pack Client Stage
作业设计使用 Java Pack Client Stage

图 8. 作业设计使用 Java Integration Stage
作业设计使用 Java Integration Stage

注意,根据您的要求,目标 Stage 可以是任何类型。例如,如果您想要将 Excel 数据写入数据库,那么可以使用 EE Stage、DB2 Connector Stage、DB2 Plug-in Stage 等作为目标。

Java Intgeration Stage 属性

在 Classpath 字段中提及了包含 .class 文件的目录名绝对路径。在该示例中,ReadExcelData.class 位于 c:\santhosh 目录下。

在 Optional JVM 选项字段中,提及了 POI jar 文件在类路径选项中的位置。该示例的 jar 文件位于 c:\santhosh 目录下。建议您从 Apache 下载网站 中下载 Apache POI jar 文件。

在 Users Class 字段中,提及了提取 Excel 数据的 Java 类名称。该实例的 Java 类名称是 ReadExcelData

在 Custom Properties 字段中,提及了输入 Excel 文件的绝对路径。该示例的名为 EmployeeData.xls 的输入 Excel 文件显示在 c:\santhosh 目录下。

注意:Java 应用程序期望路径名中包含双斜杠。因此,我们使用双斜杠精心为您提供了路径名。


图 9. Stage 属性
 Stage 属性

Java Integration Stage Output 列定义

样例 Excel 文件包含一些员工数据,比如姓名、年龄、薪金、部门和职位。因为您必须提取这些数据,并将它们写入目标阶段,所以必须在 Output 选项卡中定义 5 个列。我将这 5 个列分别命名为 EmpName、EmpAge、EmpDivision、EmpSalary 和 EmpLocation,列定义如图 10 所示。


图 10. 输出列定义
输出列定义

定义了输出列后,它们将自动传播到目标 Sequential File Stage 列属性。在 Sequential File Stage 输入属性中,只需提及输出文件名即可,该文件将包含提取的 Excel 数据,这些数据是关系型数据。我的输出文件名是 ExtractedData.txt。


图 11. Sequential File Stage 属性
Sequential File Stage 属性

如果 Java Client Stage 作为源而不是 Java Integration Stage 使用,则需要填写相应的 Stage 属性。图 12 和图 13 展示了 Java Client Stage 属性。


图 12. Java Client Stage 属性
Java Client Stage 属性

图 13. Java Client Stage 用户属性
Java Client Stage 用户属性

编译和执行 DataStage 作业

在配置所有的作业属性后,需要保存该作业,然后单击 F7 对该作业进行编译。编译成功后,按下 Ctrl+F5 执行作业。执行完作业后,Java Integration Stage 将会调用 ReadExcelData 类从 Excel 文件中提取 Excel 数据,然后将提取的数据写入 EmployeeData.txt 文件。您会看到该类从 Excel 文件中读取了 5 个行,然后将它们写入目标 Sequential File Stage。


图 14. Java Integration Stage 作业执行
 Java Integration Stage 作业执行

图 15. Java Client Stage 作业执行
Web Service Client SSL 选项

图 16. 提取的 Excel 数据
提取的 Excel 数据

注意:如果输入 Excel 文件中的列数与输出链接中定义的列数不匹配,则会在 Director Log 中生成一个 java.lang.IndexOutOfBoundsException。因此,您应该确保 Excel 文件和 DataStage 输出链接中的列数一致。为了使 Java Application 更有效,您可以向您的代码中添加健壮的异常处理机制。


结束语

在本文中,我们介绍了 IBM InfoSphere Information Server 和 DataStage,以及 Java Integration Stage、Java Pack 和 Java Pack API。还了解了 Apache POI 的 Excel 处理功能,以及如何使用 Java Pack API 和 Apache POI API 开发一个 Java 应用程序来提取 Excel 数据。此外,本文还介绍了如何使用 Java Integration Stage 和 Java Pack Client Stage 设计一个 DataStage 作业来调用提取 Excel 数据的 Java 应用程序。本文中介绍的解决方案可有效地用于 Information Server 版本中,该版本没有提供专用组件来读取 Excel 文件。

Apache POI API 和 Java Pack API 也可用于 DataStage Java Pack 作业中,以便从非 Excel 格式中创建 Excel 文档。要使用这样一个场景,请按照本文中介绍的方法进行操作。


参考资料

学习

获得产品和技术

讨论

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=941342
ArticleTitle=在 IBM InfoSphere Information Server 中使用 DataStage Java Integration Stage 和 Java Pack 从 Excel 源文件中提取数据
publish-date=08192013