获取HDFS目录中单个文件的行数

时间:2015-09-08 05:53:12

标签: shell hadoop hdfs bigdata

我想获取HDFS中目录的单个文件(以及文件名)的行数,输出应该类似于:

4 filename_1.txt
20 filename_2.txt
8 filename_3.txt

目前我正在使用

hadoop fs -cat / user / TMM / | wc -l <​​/ p>

,它给出了目录的总数。 (在这种情况下,例如:32)

有没有办法做到这一点?

2 个答案:

答案 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中的文件。