跳转到主要内容

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

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

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

  • 关闭 [x]

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

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

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

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

  • 关闭 [x]

使用 InfoSphere DataStage Java stages 和 ICU4J 完成音译 ETL 作业

集成 Java 音译模块和 DataStage 的 Java Transformer Stage

Bharath Kumar Devaraju, 软件工程师, IBM
BharathKumar Devaraju 的照片
Bharath Kumar Devaraju 自 2009 年加入 IBM,目前从事 IBM 云计算计划的 “数据即服务” 研发。他是一位通过 QualityStage 认证的解决方案开发人员。他拥有广泛的客户 POC 工作经验,并曾参与过成长市场方面的售前活动。

简介: 随着成长市场中的数据质量的重要性越来越大,无结构的脏数据需要立即清洁。然而,这项工作的一个挑战是,世界各国有多种语言,有效处理语言学数据的难度很大。例如,在印度,每个州的官方语言均有所不同,数据需要同时提供英语版本和本地语言版本,这种情况加剧了数据一致性问题的严重性。本文将阐述如何在音译过程中实现数据一致性,如何使用 IBM® InfoSphere® Information Server DataStage® 准备语言资料数据,这些是提取、转换和加载 (ETL) 场景的一部分。

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


简介

在一个成长市场地区,任何清洁 (cleansing) 供应商或解决方案提供商遇到的首要问题就是可用数据的方言和语言学方面不一致。在进行数据清洁处理之前,首先应该进行音译 (transliteration),以便在数据中引入一致性。清洁解决方案涉及的数据量通常很大,因此,清洁处理通常在数据仓库项目中进行,且最好用于 ETL 操作过程中。IBM DataStage 提供各种 Java™ stages 和 tr4j 库,协助开发和集成 Java 程序和 ETL 作业。tr4j 库与 DataStage 安装程序捆绑在一起。

ICU4J (International Components for Unicode) 库是一个面向 Java 的开源库,被各个软件供应商广泛采用来提供全球化和统一字符标准 (unicode) 支持。

本文逐步演示如何使用 icu4jtr4j 库开发一个音译 Java 程序,并将其集成到 DataStage 的 Java transformer stage。

先决条件

要跟随本文的指导,您需要使用以下软件:

  • InfoSphere DataStage and Information Services Director (ISD) 8.5
  • ICU4J(参见 参考资料 部分中的链接)

另外,您需要掌握在 DataStage Designer 中设计和运行 ETL 作业的基本技能,还要具备 Java 编程中级技能。应该将输入文件编码为 UTF-8 或 UTF-16 格式。


使用 Java Transformer Stage 设计一个 ETL 作业

第一步是设计一个 ETL 作业,它可以从源文件读取输入,并拥有一个 Java Transformer Stage 来执行转换。目标可以是文件、数据库或其他任意处理步骤。

执行以下步骤设计此作业:

  1. 在 DataStage Designer 中新建一个并行作业。
  2. 从调色板选择需要的作业 stage。例如,一个同时充当源和目标的序列文件,以及 Java Transformer Stage。
  3. 对于输入文件 stage,配置源文件的元数据和位置。双击文件 stage,在 Stage 选项卡中,选择 NLS map。这里,您还必须为输入文件选择编码类型。本示例选择的是 UTF-8,如图 1 所示。

    图 1. 指定输入文件的编码类型
    屏幕截图显示 Sequential_File_0 为 stage name,UTF-8 为 map name

  4. 对输出文件重复上述步骤。最后,您的作业应该如图 2 所示。

    图 2. ETL 音译作业设计
    作业显示 Sequential_File_0 位于左边,通过 DSLink3 到达 Java_Transformer_1,然后通过 DSLink$ 到达 Sequential_File_2


使用 ICU4J 和 tr4j 库执行音译的 Java 程序

Icu4j 提供了一组类,用于提供区域化支持。支持音译功能的主要类是 Transliterator 和 Normalizer。下面是这两个类的详细信息。

  • Transliterator:这个类提供了一个 transliterate() 函数,用于将字符串从一种语言脚本转换到另一种语言脚本。transliterate() 函数是无状态的,因此不保留前面的调用的信息。使用 transliterate() 函数之前,必须初始化 Transliterator 实例:提供源语言和目标语言,中间用短横线(-)分隔。例如: Transliterator.getInstance("Hindi-Latin");
  • Normalizer:这个类提供一些函数,将音译函数的输出规范化为一种合成或分解格式。例如,拉丁字符(比如 A-acute)被规范化为单个 (A) 的合成格式或两个 (AA) 的分解格式。

Java 程序要嵌入到 DataStage 的 Java Stage 中,应该采用清单 1 中指定的格式。处理函数应该包含由 Java Stage 执行的所有处理逻辑。


清单 1. Java Transformer Stage 中嵌入的 Java 程序的格式
				
public class <classname> extends Stage{
	  public void initialize()    {
	        trace("TableSource.initialize");
	       
	    }

	    public void terminate()    {
	        trace("TableSource.terminate");
	    }
    public int process()    {
				.....
		}
		}

清单 2 显示使用 icu4jtr4j 库执行音译的样例程序。这个样例代码显示任何语言的输入都被音译为拉丁字母并规范化。输入行以 UTF-8 格式读取。


清单 2. 处理函数中写入的实际音译操作
				
public String toBaseCharacters(final String sText) {
		    if (sText == null || sText.length() == 0)
		        return sText;

		    final char[] chars = sText.toCharArray();
		    final int iSize = chars.length;
		    final StringBuilder sb = new StringBuilder(iSize);
		   for (int i = 0; i < iSize; i++) {
		        String sLetter = new String(new char[] { chars[i] });
		        sLetter = Normalizer.normalize(sLetter, Normalizer.NFKD);

		        try {
		            byte[] bLetter = sLetter.getBytes("UTF-8");
		            sb.append((char) bLetter[0]);
		        } catch (UnsupportedEncodingException e) {
		        }
		    }
		    return sb.toString();
		}
		
   public int process()    {
	    	try {
	    		
	         //  do {
	        		Transliterator t=Transliterator.getInstance("Any-Latin");
	        		
	            	Row inputRow = readRow();
	            
	        		
	            	  if (inputRow == null) {
	                      return OUTPUT_STATUS_END_OF_DATA;
	                  }

	                  boolean  reject      = false;
	                  int      columnCount = inputRow.getColumnCount();
	                  Row      outputRow   = createOutputRow();

	   for (int columnNumber = 0; columnNumber < columnCount; columnNumber++) 
		  {
	                String value = inputRow.getValueAsString(columnNumber,"UTF-8");

	                      if ((value == null) || (value.indexOf('*') >= 0)) {
	                          reject = true;
	                          outputRow.setValueAsString(columnNumber, value);
	                      } else {
	          outputRow.setValueAsString(
					columnNumber,toBaseCharacters(
								t.transliterate(value)));
	                      }
	                  }

	                  if (reject) {
	                      rejectRow(outputRow);
	                  } else {
	                      writeRow(outputRow);
	                  }
					......



集成 Java 程序和 ETL 作业的 Java Transformer Stage

在 Java Transformer Stage 的 properties 页中,提供表 1 中的详细信息。


表 1. 需要设置的各种 Java Transformer Stage 属性

属性名需要插入的值
Classpathicu4j jar 的完整路径
指定包含上述示例的 /opt 中部署的 Java Programs 包的文件夹的路径
Transformer class name提供 Java 音译程序的类名

图 3 了显示用于设置这些属性的屏幕。


图 3. Java Transformer Stage properties 页面
屏幕显示以下输入字段:stage name、transformer class name 和 user's classpath

完成这个步骤之后,就可以启动您的音译 ETL 作业了。编译并运行作业。还可以使用此作业的输出作为输入来清洁操作。


异常情况

注意以下可能出现的异常情况:

  • 如果作业完成,但输出文件没有包含经过音译的输出,请检查输入文件是否保存为 UTF 编码之外的其他格式,比如 UCS。如果是这样,可以使用一个适当的编辑器来更改输入文件的编码。
  • DataStage tr4j 库提供了一些函数,通过将消息记录到 DataStage director 来促进调试。这样的函数包括 error()info()

结束语

本文讲解如何使用 ICU4J 库来执行音译,以及必须执行的各种配置。本文展示了如何使用 InfoSphere Information Server DataStage 来实现音译过程。音译是解决多语言挑战的一个关键组件,提供一个公共基础来构建一个可预测的标准化规则集。因此,本文就展示了如何使用 Information Server DataStage 来解决您的音译挑战。


参考资料

学习

获得产品和技术

讨论

关于作者

BharathKumar Devaraju 的照片

Bharath Kumar Devaraju 自 2009 年加入 IBM,目前从事 IBM 云计算计划的 “数据即服务” 研发。他是一位通过 QualityStage 认证的解决方案开发人员。他拥有广泛的客户 POC 工作经验,并曾参与过成长市场方面的售前活动。

关于报告滥用的帮助

报告滥用

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


关于报告滥用的帮助

报告滥用

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


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, Open source, Java technology
ArticleID=754028
ArticleTitle=使用 InfoSphere DataStage Java stages 和 ICU4J 完成音译 ETL 作业
publish-date=08252011
author1-email=bhdevara@in.ibm.com
author1-email-cc=