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之外下载,合并和重新上载.
该错误与您尝试将命令的标准输出重定向回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,无论你是否这样做
小智 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上的输出文件中.
| 归档时间: |
|
| 查看次数: |
23772 次 |
| 最近记录: |