使用命令行查找hdfs分布式文件中的总行数

时间:2015-08-18 17:52:03

标签: unix hadoop apache-spark hdfs

我正在开发一个集群,其中数据集以分布式方式保存在hdfs中。这就是我所拥有的:

[hmi@bdadev-5 ~]$ hadoop fs -ls /bdatest/clm/data/
Found 1840 items
-rw-r--r--   3 bda supergroup          0 2015-08-11 00:32 /bdatest/clm/data/_SUCCESS
-rw-r--r--   3 bda supergroup   34404390 2015-08-11 00:32 /bdatest/clm/data/part-00000
-rw-r--r--   3 bda supergroup   34404062 2015-08-11 00:32 /bdatest/clm/data/part-00001
-rw-r--r--   3 bda supergroup   34404259 2015-08-11 00:32 /bdatest/clm/data/part-00002
....
....

数据格式如下:

[hmi@bdadev-5 ~]$ hadoop fs -cat /bdatest/clm/data/part-00000|head
V|485715986|1|8ca217a3d75d8236|Y|Y|Y|Y/1X||Trimode|SAMSUNG|1x/Trimode|High|Phone|N|Y|Y|Y|N|Basic|Basic|Basic|Basic|N|N|N|N|Y|N|Basic-Communicator|Y|Basic|N|Y|1X|Basic|1X|||SAM|Other|SCH-A870|SCH-A870|N|N|M2MC|

所以,我想要做的是计算原始数据文件data中的总行数。我的理解是像part-00000part-00001等分布式块有重叠。因此,只计算part-xxxx个文件中的行数并将它们相加就不起作用了。此外,原始数据集data的大小为~70GB。如何有效地找出总行数?

6 个答案:

答案 0 :(得分:5)

更有效率 - 您可以使用spark来计算数量。的线条。以下代码段有助于计算行数。

text_file = spark.textFile("hdfs://...")
count = text_file.count();
count.dump();

显示no的计数。线条。

Note: The data in different part files will not overlap

使用hdfs dfs -cat /bdatest/clm/data/part-* | wc -l也会为您提供输出,但这会将所有数据转储到本地计算机并花费更长时间。

最佳解决方案是使用MapReduce或spark。 MapReduce需要更长的时间来开发和执行。如果安装了火花,这是最好的选择。

答案 1 :(得分:4)

如果您只需要查找数据中的行数。您可以使用以下命令:

hdfs dfs -cat /bdatest/clm/data/part-* | wc -l

此外,您可以使用身份映射器编写一个简单的mapreduce程序,该映射器将输入作为输出发出。然后检查计数器并找到mapper的输入记录。这将是您数据中的行数。

答案 2 :(得分:2)

Hadoop one liner:

hadoop fs -cat /bdatest/clm/data/part-* | wc -l

来源:http://www.sasanalysis.com/2014/04/10-popular-linux-commands-for-hadoop.html

另一种方法是创建一个map reduce作业,其中mapper为每一行发出1并且reducer对这些值求和。有关解决方案,请参阅Writing MApreduce code for counting number of records的已接受答案。

答案 3 :(得分:1)

这是一项常见的任务,我希望在fs中有一个子命令来执行此操作(例如hadoop fs -wc -l inputdir),以避免将所有内容流式传输到一台执行" wc -l&#34的计算机;命令。

为了有效地计算行数,我经常使用hadoop streaming和unix命令,如下所示:

hadoop jar ${HADOOP_HOME}/hadoop-streaming.jar \
  -Dmapred.reduce.tasks=1 \
  -input inputdir \
  -output outputdir \
  -mapper "bash -c 'paste <(echo "count") <(wc -l)'" \
  -reducer "bash -c 'cut -f2 | paste -sd+ | bc'" 

每个映射器都会运行&#34; wc -l&#34;在它拥有的部件上,然后一个减速器将总结所有映射器的计数。

答案 4 :(得分:1)

如果你有一个非常大的文件有大致相同的行内容(我想象一个JSON或日志条目),并且你不关心精度,你可以计算它。

示例,我将原始JSON存储在文件中:

文件大小:750Mo 第一行的大小:752个字符(==&gt; 752个八位字节)

行=&gt;约1.020.091

正在运行cat | wc -l会产生1.018.932

不太糟糕^^

答案 5 :(得分:0)

您可以使用hadoop流式处理此问题。

这是您运行它的方式:

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-streaming-2.6.0-cdh5.11.0.jar -input <dir> -output <dir> counter_mapper.py -reducer counter_reducery -file counter_mapper.py -file counter_reducer.py

<强> counter_mapper.py

#!/usr/bin/env python

import sys
count = 0

for line in sys.stdin:
    count = count + 1

print count

<强> counter_reducer.py

#!/usr/bin/env python

import sys
count = 0

for line in sys.stdin:
    count = count +int(line)

print count