所以......,各种来源的边缘节点都有大量数据。一些文件具有来自特定数据库的评论部分的控制-M字符。
由于文件作为平面文件而不是sqoop登陆边缘节点,因此当文件上传到hive时,control-m字符被视为新记录并且验证失败(hive表获取的行多于源)
解决方案很简单,使用sed删除control-m,perl你有什么。
过了一会儿,边缘节点太紧张了,我正在评估是否可以在HDFS上进行数据清理,以便分配负载(使用map reduce),如下所示:
hadoop jar /path/to/streaming/hadoop-streaming-2.6.0.2.2.4.2-2.jar \
-input data/file_with_control-m.txt \
-mapper /bin/cat \
-reducer "/bin/sh myreducer.sh" \
-file "/home/shell/myreducer.sh" \
-output data/output
myreducer.sh
perl -p -i -e "s/\r//g"
# or
sed 's/^M//g'
这样可行,但问题是,map的inherit属性是shuffle / sort,数据没有排序。不只是“记录”,如第5行和第8行互换,即使每个记录中的字段都在随机位置。 Map reduce不保证订购
Pig也不起作用,control-m字符被视为行尾,数据加载方式与hive完全相同(行数多于给定数量)
考虑的其他事项是:
查看源系统是否可以清理文件
源系统指定不同的记录分隔符(我使用它 创建hive表时记录分隔符[以#结尾的行 '源系统记录分隔符'])
虽然这已经完成并且知道订购和Map-Reduce没有合在一起,只需将它放在那里看看是否有办法解决。