知识库 : 数据迁移之PIG篇—如何处理HBASE数据含换行符问题

Edit Document

数据 迁移之PIG 篇—如何 处理 HBASE数据 含换行符问题

 

目录

一、背景

二、 PIG 代码修改

三、示例

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一 、 背景

从 H Base 向 关系库迁移 数据 的时候, 方便 的工具不多, PIG是 可选工具之一。 当HB ase 表字段 数据中含有换行符的时候,所有工具可能都会失效, PIG也 不例外 。通过 本文给大家介绍如何通过 PIG处理 这个问题。

先 看下, 通过PIG导 出 HB ase 数据 脚本是怎样的。

导出 数据时,可以指定列分割符 (P igStorage 第一个 参数),但是 却 没有可以指定换行符的 地方 ,如果导出时,我们可以自定义换行符,那么 前面 我们提到的问题就可以迎刃而解了。

二、 PIG 代码 修改

翻看 下 PIG的 代码,发现 PIG的 输出主要由 PigTextOutputFormat 内部 类 PigLineRecordWriter 处理 ,其中对行结束符的处理代码如下:

通过 源码,我们可以看到 在PIG的 输出中, 行 结束符是程序写死的‘ \n ’ , 看来 我们 就不得不改造下 PIG代码 了。

我 的修改方式是增加 P igStorage 带 行结束符的构造函数,然后 把 这个行结束符 带到 输出 类中 ,当然也可以采用其它方式处理,这里就不一一介绍了。

详细 修改就不一一列举,只提几处关键修改点。

增加 PigTextOutputFormat 带行 结束符的构造函数。

把 传入 PigTextOutputFormat 的 行结束符传递给 PigLineRecordWriter 。

增加P igStorage 带 行结束符的构造函数。

把 传入的行结束符传递给 PigTextOutputFormat 。

把编译 后的文件放到 PIG的 pig-0.12.0-cdh5.0.4-withouthadoop .jar、 pig-0.12.0-cdh5.0.4 .jar里 就可以使用了。

三、 示例

假设HBASE表test的f1:info字段 里含有换行符 \n,以此为 例,看如何把该表数据正确导入到 ORACLE库中。

第一步 , PIG脚本 ,我们指定行结束符’$$’ ,脚本 如下:

第二步 ,对输出文件进行处理( 替换 数据 字段 里的换行符,替换$$ 为\n ) , 处理脚本 (shell脚本 )如下 (test. sh) :

 

第三步 ,处理 PIG输出 文件

第一个 参数是 PIG的 输出文件,第二个参数 PIG指定 的行结束符,第三个是处理后的文件。

第四步 , 把处理 后的数据文件导入到 ORACLE中 ,这个可选方式就比较多了,不作说明。

第 五 步 ,把导入后的数据 内容替换 回 换行符\n。

以ORACLE为 例:    update  mytest set sinfo = replace(sinfo,'##',chr(10))

最终 结果:

 

如需要 修改后的 PIG JAR 包 , 可联系 kongml@yonyou.com 。

Attachments:

数据迁移之PIG篇—如何处理HBASE数据含换行符问题.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)