Mapreduce 替换HDFS中的control-m字符

Mapreduce 替换HDFS中的control-m字符,mapreduce,hdfs,hadoop-streaming,Mapreduce,Hdfs,Hadoop Streaming,所以…,有一堆数据从不同的来源传到边缘节点。某些文件具有来自特定数据库注释部分的control-M字符 由于文件作为平面文件而不是sqoop降落在边缘节点上,因此当文件上载到配置单元时,control-m字符被视为新记录,验证失败(配置单元表获得的行数多于源) 解决方案是直截了当的,使用sed、perl和您所拥有的东西删除control-m 在这段时间之后,边缘节点压力过大,我正在评估是否可以在HDFS上进行数据清理,以便分配负载(使用map reduce),如下所示: myreducer.sh

所以…,有一堆数据从不同的来源传到边缘节点。某些文件具有来自特定数据库注释部分的control-M字符

由于文件作为平面文件而不是sqoop降落在边缘节点上,因此当文件上载到配置单元时,control-m字符被视为新记录,验证失败(配置单元表获得的行数多于源)

解决方案是直截了当的,使用sed、perl和您所拥有的东西删除control-m

在这段时间之后,边缘节点压力过大,我正在评估是否可以在HDFS上进行数据清理,以便分配负载(使用map reduce),如下所示:

myreducer.sh

perl -p -i -e "s/\r//g"

# or

sed 's/^M//g'
这是可行的,但问题是,map reduce的继承属性被洗牌/排序,数据没有排序。不仅仅是“记录”,如第5行和第8行是互换的,甚至每个记录中带有的字段都位于随机位置。Map reduce不保证订购

Pig也不工作,control-m字符被视为行尾,数据的加载方式与hive完全相同(比给定的行数多)

考虑的其他事项包括:

  • 查看源系统是否可以清除该文件

  • 源系统指定不同的记录分隔符(我使用 创建配置单元表时记录分隔符[行终止于 “源系统记录分隔符”])


虽然这样做了,而且知道排序和Map Reduce不能同时进行,但只需将其放在那里,看看是否有解决方法。

在hive中面临同样的问题…control-m字符被视为行的末尾,数据加载与hive完全一样。。。。找到解决方案了吗?没有,在边缘节点执行此操作在配置单元中仍然面临相同的问题…control-m字符被视为行尾,数据加载与配置单元完全相同。。。。找到解决方案了吗?不,什么都没有,仍然在边缘节点进行
perl -p -i -e "s/\r//g"

# or

sed 's/^M//g'