在使用hadoop 进行mapreduce过程中 发现需要导入的记录内容复杂 在进行map过程中 value获取的值是按\n来分块 也就是每次value取到的值是\n前面的内容 这难免会导致与功能需求不符(比如一条短信内容中存在回车换行,hadoop就会将一条短信解析成2条) 这时候经讨论 我们提出了3种方案来解决该问题
1、将短信中\n \r 字符串 转义
2、将在一条记录中加入判别符号 并修改hadoop 预读逻辑 进行有目的分块
3、与2类似 运用一串规定好的识别码 将需要取记录的特征记录在一条记录开头,当程序识别到时 就会解析特征码 并取到相应的完整记录
在这三点中 1的缺点在于破坏了数据一致性所以 该方案为下下策;而二方案需要修改内部代码 难度稍大 三方案需要指定一套详细的规则来实现
最终使用2方案来解决hadoop map阶段预读自定义的效果
实现过程简述
主要通过重写TextInputFormat类以及相关的类来实现,原代码中基本逻辑是通过判断\n来截取传入参数
而我们现在需要使程序判断开头和结尾2个特殊值来框定需要的内容 (比如:您的验证码为131\n12414。 加入特殊字符 <xml>您的验证码为131\n12414。</xml> )即可实现.具体来讲就是把源程序判断\n的逻辑改为判断一个beginStr和一个endStr,再加入部分逻辑来实现特殊值间取内容的形式
转载于:https://www.cnblogs.com/njh2017/p/8696809.html