我正在使用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/**
它返回bash:/ user / username / folder / outputdirectory /:没有这样的文件或目录
我也尝试创建该目录然后再次运行 - 我仍然得到'没有这样的文件或目录'错误。
我也尝试使用-cp命令将两者都复制到一个新文件夹中,然后使用-getmerge将它们组合起来,但是对于getmerge也没有运气。
在hadoop中执行此操作的原因是文件非常庞大,需要很长时间才能在hadoop之外下载,合并和重新上传。
答案 0 :(得分:8)
该错误与您尝试将命令的标准输出重定向回HDFS有关。有一些方法可以使用hadoop fs -put
命令执行此操作,其中source参数为hypen:
bin/hadoop fs -cat /user/username/folder/csv1.csv /user/username/folder/csv2.csv | hadoop fs -put - /user/username/folder/output.csv
-getmerge
也输出到本地文件系统,而不是HDFS
Unforntunatley没有有效的方法将多个文件合并为一个(除非您想查看Hadoop'追加',但在您的hadoop版本中,默认情况下禁用并且可能有错误),而无需复制文件到一台机器,然后再回到HDFS,无论你是否在
中这样做答案 1 :(得分:6)
将文件夹中的所有文件连接到输出文件:
hadoop fs -cat myfolder/* | hadoop fs -put - myfolder/output.txt
如果hdfs上有多个文件夹,并且想要连接每个文件夹中的文件,则可以使用shell脚本执行此操作。 (注意:这不是很有效,可能很慢)
语法:
for i in `hadoop fs -ls <folder>| cut -d' ' -f19` ;do `hadoop fs -cat $i/* | suy hadoop fs -put - $i/<outputfilename>`; done
<强>例如强>
for i in `hadoop fs -ls my-job-folder | cut -d' ' -f19` ;do `hadoop fs -cat $i/* |hadoop fs -put - $i/output.csv`; done
<强>说明:强> 因此,您基本上遍历所有文件并将每个文件夹内容捕获到hdfs上的输出文件中。