如何在Hadoop中跳过HDFS大文件指定行数并拷贝至新文件?
跳过HDFS文件前36行拷贝的实现方法
存在可直接实现该需求的方案,无需额外安装第三方工具,常用实现方法如下:
- 小/中等体积文件方案(单节点执行)
直接通过hadoop fs命令结合shell文本处理工具管道实现,命令示例:
命令说明:# 方法1:用sed实现 hadoop fs -cat /源文件HDFS路径 | sed -n '37,$p' | hadoop fs -put - /目标文件HDFS路径 # 方法2:用tail实现,效果完全一致 hadoop fs -cat /源文件HDFS路径 | tail -n +37 | hadoop fs -put - /目标文件HDFS路径sed -n '37,$p'和tail -n +37均表示从第37行开始输出内容直到文件末尾,末尾的-代表读取标准输入的内容写入HDFS目标路径。 - 大文件/多文件分布式场景方案
单节点管道方案会让所有数据流经执行命令的节点,大文件场景效率极低,可通过Hadoop Streaming作业利用集群资源分布式处理,命令示例:
注意事项:目标目录必须是预先不存在的空目录,作业执行完成后结果会存放在该目录下的part文件中,如需合并为单个文件可后续执行hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar \ -D mapreduce.job.reduces=0 \ -input /源文件/目录HDFS路径 \ -output /目标目录HDFS路径 \ -mapper 'sed -n "37,\$p"'hadoop fs -getmerge操作。
额外注意事项
- 若需要对全局合并后的总内容跳过前36行(而非每个输入文件分别跳过前36行),仅可使用第一种单节点管道方案
- 若HDFS文件采用了非行分割的特殊格式,建议先小范围验证输出内容的正确性,避免行识别异常
内容的提问来源于stack exchange,提问作者John Humanyun
相关产品推荐
相关产品推荐

