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