Shell 获取HDFS目录中单个文件的行数
我想对HDFS中某个目录中的单个文件(以及文件名)进行行计数,输出应与以下类似:Shell 获取HDFS目录中单个文件的行数,shell,hadoop,hdfs,bigdata,Shell,Hadoop,Hdfs,Bigdata,我想对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-
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$8}');
do
echo $i `hadoop fs -cat $i | wc -l`;
done;
以美元表示的i的(hadoop fs-ls | tr-s'|grep'/'|awk'{print$8});
做
echo$i`hadoop fs-cat$i|wc-l`;
完成;
这将打印hdfs路径下的每个文件以及行数
[注意:文件名打印在我的hadoop版本的hadoop fs-ls
输出中的8个索引处,请在您的环境中进行相应的检查]您可以使用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;
以美元表示的i的(hadoop fs-ls | tr-s'|grep'/'|awk'{print$8});
做
echo$i`hadoop fs-cat$i|wc-l`;
完成;
这将打印hdfs路径下的每个文件以及行数
[注意:文件名打印在我的hadoop版本的hadoop fs-ls
输出中的8个索引处,请在您的环境中相应地检查它]如果您的数据量足够小,您可以这样做,但这种方法意味着将所有数据从HDFS客户机传输到客户机。不太好
另一种方法是创建MapReduce作业。从上下文中获取文件名(getInputSplit),并为每个输入行编辑一个事件,其中键可以是文件名,值可以是1。如果您在映射中创建一个本地聚合,以避免将大量对象传输到reducer,效果会更好。在reducer中,完成聚合并将输出写入HDFS中的文件。如果您的数据量足够小,您可以这样做,但这种方法意味着将所有数据从HDFS客户机传输到客户机。不太好
另一种方法是创建MapReduce作业。从上下文中获取文件名(getInputSplit),并为每个输入行编辑一个事件,其中键可以是文件名,值可以是1。如果您在映射中创建一个本地聚合,以避免将大量对象传输到reducer,效果会更好。在reducer中,完成聚合并将输出写入HDFS中的文件