如何使用Hadoop FS shell将hadoop中的两个文件连接成一个?

use*_*044 7 shell hadoop concatenation

我正在使用Hadoop 0.20.2并且如果可能的话,想使用-cat shell命令将两个文件连接成一个(来源:http://hadoop.apache.org/common/docs/r0.19.2/hdfs_shell.html)

这是我提交的命令(名称已更改):

**/path/path/path/hadoop-0.20.2> bin/hadoop fs -cat /user/username/folder/csv1.csv /user/username/folder/csv2.csv > /user/username/folder/outputdirectory/**
Run Code Online (Sandbox Code Playgroud)

它返回bash:/ user/username/folder/outputdirectory /:没有这样的文件或目录

我也尝试创建该目录,然后再次运行它 - 我仍然得到'没有这样的文件或目录'错误.

我也尝试使用-cp命令将两者都复制到一个新的文件夹中并使用-getmerge来组合它们,但是也没有运气的getmerge.

在hadoop中执行此操作的原因是文件很大并且需要很长时间才能在hadoop之外下载,合并和重新上载.

Chr*_*ite 9

该错误与您尝试将命令的标准输出重定向回HDFS有关.有一些方法可以做到这一点,使用hadoop fs -putsource参数为hypen 的命令:

bin/hadoop fs -cat /user/username/folder/csv1.csv /user/username/folder/csv2.csv | hadoop fs -put - /user/username/folder/output.csv
Run Code Online (Sandbox Code Playgroud)

-getmerge 也输出到本地文件系统,而不是HDFS

Unforntunatley没有有效的方法将多个文件合并为一个(除非您想查看Hadoop'追加',但在您的hadoop版本中,默认情况下禁用并且可能有错误),而无需将文件复制到一台机器然后回到HDFS,无论你是否这样做

  • 自定义地图使用单个reducer和自定义mapper reducer减少作业,保留文件排序(请记住每行将按键排序,因此您需要将键设置为输入文件名和行号的某种组合,并且价值将是线本身)
  • 通过FsShell命令,取决于您的网络拓扑 - 即您的客户端控制台是否与数据节点有良好的速度连接?这肯定是你最努力的事情,并且可能比MR工作更快完成同样的事情(因为一切都必须去一台机器,所以为什么不是你的本地控制台呢?)


小智 6

要将文件夹中的所有文件连接到输出文件:

hadoop fs -cat myfolder/* | hadoop fs -put - myfolder/output.txt
Run Code Online (Sandbox Code Playgroud)

如果hdfs上有多个文件夹,并且要在每个文件夹中连接文件,则可以使用shell脚本执行此操作.(注意:这不是很有效,可能很慢)

句法 :

for i in `hadoop fs -ls <folder>| cut -d' ' -f19` ;do `hadoop fs -cat $i/* | suy hadoop fs -put - $i/<outputfilename>`; done
Run Code Online (Sandbox Code Playgroud)

例如:

for i in `hadoop fs -ls my-job-folder | cut -d' ' -f19` ;do `hadoop fs -cat $i/* |hadoop fs -put - $i/output.csv`; done
Run Code Online (Sandbox Code Playgroud)

说明: 因此,您基本上遍历所有文件并将每个文件夹内容捕获到hdfs上的输出文件中.