我正在开发一个集群,其中数据集以分布式方式保存在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-00000
,part-00001
等分布式块有重叠。因此,只计算part-xxxx
个文件中的行数并将它们相加就不起作用了。此外,原始数据集data
的大小为~70GB
。如何有效地找出总行数?
答案 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