我想获取HDFS中目录的单个文件(以及文件名)的行数,输出应该类似于:
4 filename_1.txt
20 filename_2.txt
8 filename_3.txt
目前我正在使用
hadoop fs -cat / user / TMM / | wc -l </ p>
,它给出了目录的总数。 (在这种情况下,例如:32)
有没有办法做到这一点?
答案 0 :(得分:0)
您可以使用shell脚本执行此操作,请参阅以下可能对您有所帮助的代码段。
for i in $( hadoop fs -ls <hdfs-path> | tr -s ' ' | grep '/' | awk '{print$8}');
do
echo $i `hadoop fs -cat $i | wc -l`;
done;
这将打印hdfs-path
下的每个文件以及行数。
[注意:文件名是在我的hadoop版本的hadoop fs -ls
输出中的8索引处打印的,请相应地在您的环境中查看]
答案 1 :(得分:0)
如果您的数据量足够小,您可以这样做,但这种方法意味着将所有数据从HDFS custer传输到客户端计算机。不好。
另一种方法是创建MapReduce作业。从上下文中获取文件名(getInputSplit)并为每个输入行发出一个事件,其中键可以是文件名,值可以是1.如果在地图中创建本地聚合以避免将大量对象传输到减速器。在reducer中完成聚合并将输出写入HDFS中的文件。