我在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脚本,它可以将所有这些单独目录中的所有文件合并为一个单独的文件名,具体取决于路径。
示例:
/ data / topicname / year = 2017 / month = 02 / day = 28 / hour = 00内的所有JSON到一个合并文件中full_2017_02_28_00.json
/ data / topicname / year = 2017 / month = 02 / day = 28 / hour = 01内的所有JSON到一个合并文件中full_2017_02_28_01.json
/ data / topicname / year = 2017 / month = 02 / day = 28 / hour = 02内的所有JSON到一个合并文件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。
答案 0 :(得分:1)
for file in `hdfs dfs -ls -R /src_folder | awk '$2!="-" {print $8}'`; do hdfs dfs -cat $file | hdfs dfs -appendToFile - /target_folder/filename;done
由于流程是连续的,因此所需的时间将取决于文件的数量和大小。
答案 1 :(得分:-1)
我能够通过以下脚本实现我的目标:
#!/bin/bash
for k in 01 02 03 04 05 06 07 08 09 10 11 12
do
for j in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
do
for i in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
do
hadoop fs -cat /data/topicname/year=2017/month=$k/day=$j/hour=$i/* | hadoop fs -put - /merged/TEST1/2017"_"$k"_"$j"_"$i.json
hadoop fs -du -s /merged/TEST1/2017"_"$k"_"$j"_"$i.json > /home/test/sizetest.txt
x=`awk '{ print $1 }' /home/test/sizetest.txt`
echo $x
if [ $x -eq 0 ]
then
hadoop fs -rm /merged/TEST1/2017"_"$k"_"$j"_"$i.json
else
echo "MERGE DONE!!! All files generated at hour $i of $j-$k-2017 merged into one"
echo "DELETED 0 SIZED FILES!!!!"
fi
done
done
done
rm -f /home/test/sizetest.txt
hadoop fs -rm -r /data/topicname