在一个成长市场地区,任何清洁 (cleansing) 供应商或解决方案提供商遇到的首要问题就是可用数据的方言和语言学方面不一致。在进行数据清洁处理之前,首先应该进行音译 (transliteration),以便在数据中引入一致性。清洁解决方案涉及的数据量通常很大,因此,清洁处理通常在数据仓库项目中进行,且最好用于 ETL 操作过程中。IBM DataStage 提供各种 Java™ stages 和 tr4j 库,协助开发和集成 Java 程序和 ETL 作业。tr4j 库与 DataStage 安装程序捆绑在一起。
ICU4J (International Components for Unicode) 库是一个面向 Java 的开源库,被各个软件供应商广泛采用来提供全球化和统一字符标准 (unicode) 支持。
本文逐步演示如何使用 icu4j 和 tr4j 库开发一个音译 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 来执行转换。目标可以是文件、数据库或其他任意处理步骤。
执行以下步骤设计此作业:
- 在 DataStage Designer 中新建一个并行作业。
- 从调色板选择需要的作业 stage。例如,一个同时充当源和目标的序列文件,以及 Java Transformer Stage。
- 对于输入文件 stage,配置源文件的元数据和位置。双击文件 stage,在 Stage 选项卡中,选择 NLS map。这里,您还必须为输入文件选择编码类型。本示例选择的是 UTF-8,如图 1 所示。
图 1. 指定输入文件的编码类型
- 对输出文件重复上述步骤。最后,您的作业应该如图 2 所示。
图 2. ETL 音译作业设计
使用 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 显示使用 icu4j 和 tr4j 库执行音译的样例程序。这个样例代码显示任何语言的输入都被音译为拉丁字母并规范化。输入行以 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 属性
| 属性名 | 需要插入的值 |
|---|---|
| Classpath | icu4j jar 的完整路径 |
| 指定包含上述示例的 /opt 中部署的 Java Programs 包的文件夹的路径 | |
| Transformer class name | 提供 Java 音译程序的类名 |
图 3 了显示用于设置这些属性的屏幕。
图 3. Java Transformer Stage properties 页面
完成这个步骤之后,就可以启动您的音译 ETL 作业了。编译并运行作业。还可以使用此作业的输出作为输入来清洁操作。
注意以下可能出现的异常情况:
- 如果作业完成,但输出文件没有包含经过音译的输出,请检查输入文件是否保存为 UTF 编码之外的其他格式,比如 UCS。如果是这样,可以使用一个适当的编辑器来更改输入文件的编码。
- DataStage
tr4j库提供了一些函数,通过将消息记录到 DataStage director 来促进调试。这样的函数包括error()和info()。
本文讲解如何使用 ICU4J 库来执行音译,以及必须执行的各种配置。本文展示了如何使用 InfoSphere Information Server DataStage 来实现音译过程。音译是解决多语言挑战的一个关键组件,提供一个公共基础来构建一个可预测的标准化规则集。因此,本文就展示了如何使用 Information Server DataStage 来解决您的音译挑战。
学习
- 访问 ICU 主页,进一步了解 ICU 库和 ICU4J。
- 阅读 IBM Redbooks® 出版物 IBM
InfoSphere DataStage Data Flow and Job Design,进一步了解 DataStage。
- 访问 developerWorks 上的 InfoSphere 产品专区,阅读文章和教程,访问论坛和文档,连接到其他资源,提高您的 InfoSphere 技能。
- 在 developerWorks 中国网站 Information Management 专区 了解关于信息管理的更多信息,从那里获取技术文档、how-to 文章、培训、下载、产品信息以及其他资源。
- 观看 developerWorks 演示中心,包括面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。
获得产品和技术
- ICU 站点的下载部分 提供新发布下载。
- 了解如何使用 InfoSphere DataStage and InfoSphere QualityStage on the Amazon EC2
Web Service。
- 使用可从 developerWorks 直接下载的 IBM 产品评估试用版软件 构建您的下一个开发项目,或者在 IBM SOA 人员沙箱 中花费几个小时,学习如何高效实现 Service Oriented Architecture。
讨论
- 参与论坛讨论。
- 查看 developerWorks 博客 并加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
