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

如何使用hadoop FS shell将hadoop中的两个文件连接成一个文件?,shell,hadoop,concatenation,Shell,Hadoop,Concatenation,我正在使用Hadoop 0.20.2,如果可能的话,我想使用-cat shell命令将两个文件连接成一个文件(源代码:) 以下是我正在提交的命令(名称已更改): 它返回bash:/user/username/folder/outputdirectory/:没有这样的文件或目录 我还尝试创建那个目录,然后再次运行它——我仍然得到“没有这样的文件或目录”错误 我还尝试使用-cp命令将两者复制到一个新文件夹中,并使用-getmerge将它们合并,但使用getmerge也没有成功 在hadoop中执行此

我正在使用Hadoop 0.20.2,如果可能的话,我想使用-cat shell命令将两个文件连接成一个文件(源代码:)

以下是我正在提交的命令(名称已更改):

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

我还尝试创建那个目录,然后再次运行它——我仍然得到“没有这样的文件或目录”错误

我还尝试使用-cp命令将两者复制到一个新文件夹中,并使用-getmerge将它们合并,但使用getmerge也没有成功


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

此错误与您试图将命令的标准输出重新定向回HDFS有关。有几种方法可以做到这一点,使用源参数为hypen的
hadoop fs-put
命令:

bin/hadoop fs -cat /user/username/folder/csv1.csv /user/username/folder/csv2.csv | hadoop fs -put - /user/username/folder/output.csv
-getmerge
还输出到本地文件系统,而不是HDFS

不幸的是,没有有效的方法将多个文件合并到一个文件中(除非您想查看Hadoop的“附加”,但在您的Hadoop版本中,默认情况下这是禁用的,并且可能会出现错误),而无需将文件复制到一台计算机上,然后再返回到HDFS中,无论您是在什么情况下这样做的

  • 一个自定义map reduce作业,带有一个减速机和一个保留文件顺序的自定义mapper减速机(请记住,每一行都将按键排序,因此您的键需要是输入文件名和行号的某种组合,值将是行本身)
  • 通过FsShell命令,取决于您的网络拓扑,即您的客户端控制台是否与datanodes有良好的速度连接?这当然是您最省力的工作,并且可能比MR工作完成得更快(因为所有工作都必须在一台机器上完成,所以为什么不在本地控制台上完成呢?)

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

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
说明:
因此,您基本上循环所有文件,并将每个文件夹的内容放到hdfs上的输出文件中。

使用hadoop fs,正如您所建议的那样,将两个CSV连接到hdfs上的第三个文件中。非常感谢你的帮助,克里斯!追加支持在20.2中不可用,因为它不包括在内。它后来被合并成一个后续版本。什么是suy hadoop?这里面有个语法错误。它没有按预期工作,出现如下错误。如果有人能帮忙,我将不胜感激[hadoop@ip-10-171-17-77~]$表示{${header},${input_location}中的i;do
hadoop fs-cat$i/*| hadoop fs-put-${input_location}/test.txt
;完成cat:非法文件模式:索引1附近未关闭的组put:
/user/hadoop/wmg\u monthly\u plus/test.txt”:文件存在put:
/user/hadoop/wmg\u monthly\u plus/test.txt”:文件存在cat:无法写入输出流。
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