在HDFS我的文件夾路徑結構是這樣的:合併多個文件遞歸HDFS
/data/topicname/year=2017/month=02/day=28/hour=00
/data/topicname/year=2017/month=02/day=28/hour=01
/data/topicname/year=2017/month=02/day=28/hour=02
/data/topicname/year=2017/month=02/day=28/hour=03
這些路徑裏面我有很多小規模的JSON文件。我正在編寫一個shell腳本,它可以將所有這些單獨目錄中存在的所有文件合併爲一個單獨的文件名,具體取決於路徑。
例子:
內的所有JSONs /數據/ topicname /年= 2017 /月= 02 /天= 28 /小時= 00成一個合併的文件full_2017_02_28_00.json
內所有JSONs /數據/所有JSONs在/ data/topicname/year = 2017/month = 02/day = 28/hour = 2/day = 28/hour = 01到一個合併文件full_2017_02_28_01.json
02合併到一個合併文件full_2017_02_28_02.json中,依此類推。
在上述模式中保留文件名是我將嘗試實現的第二職業。目前我可以對文件名進行硬編碼。
但是,目錄路徑結構內部的遞歸串聯沒有發生。
到目前爲止,我在下面嘗試:
hadoop fs -cat /data/topicname/year=2017/* | hadoop fs -put - /merged/test1.json
錯誤: -
cat: `/data/topicname/year=2017/month=02/day=28/hour=00': Is a directory
cat: `/data/topicname/year=2017/month=02/day=28/hour=01': Is a directory
cat: `/data/topicname/year=2017/month=02/day=28/hour=02': Is a directory
遞歸貓是不會發生在上述嘗試
hadoop fs -ls /data/topicname/year=2017/month=02 | find /data/topicname/year=2017/month=02/day=28 -name '*.json' -exec cat {} \; > output.json
錯誤: -
find: ‘/data/topicname/year=2017/month=02/day=28’: No such file or directory
這是在做本地FS而不是HDFS發現上面嘗試
for i in `hadoop fs -ls -R /data/topicname/year=2017/ | cut -d' ' -f19` ;do `hadoop fs -cat $i/* |hadoop fs -put - /merged/output.json`; done
錯誤: -
cannot write output to stream message is repeated multiple times
file /merged/output.json is repeated a few times
這是如何實現的?我不想使用Spark。
這是服用大量的時間。它運行了20分鐘,並且只能附加10-15個合併文件大小爲5MB的文件 – earl
是的,使用fsshell是連續的,速度會很慢。此解決方案是您發佈的問題的語法正確版本。爲了實現並行性,請使用MapReduce或Spark(您提到過,因爲不想使用)。 – franklinsijo