数据 迁移之PIG 篇—如何 处理 HBASE数据 含换行符问题
目录
一 、 背景
从 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 。