我正在研究一个集群,其中保存了一个数据集 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-x
把文件和它们相加是行不通的。还有原始数据集 data
大小不一 ~70GB
. 如何有效地找出行的总数?
6条答案
按热度按时间dxpyg8gm1#
如果你只需要找出数据中的行数。可以使用以下命令:
也可以用identity mapper编写一个简单的mapreduce程序,将输入作为输出输出。然后检查计数器并找到Map器的输入记录。这将是数据中的行数。
uinbv5nw2#
如果您有一个非常大的文件,其行内容大致相同(我可以想象一个json或一个日志条目),并且您不关心精度,那么您可以计算它。
例如,我将原始json存储在一个文件中:
文件大小:750mo第一行大小:752个字符(=>752个八位字节)
行=>约1.020.091
跑步
cat | wc -l
给出1.018.932还不错^^
wkyowqbh3#
hadoop一行:
资料来源:http://www.sasanalysis.com/2014/04/10-popular-linux-commands-for-hadoop.html
另一种方法是创建一个map reduce作业,其中mapper为每行发出1,reducer对值求和。请参阅编写mapreduce代码的公认答案以了解解决方案的记录数。
zpf6vheq4#
您可以使用hadoop流来解决这个问题。
您可以这样运行它:
计数器Map器.py
计数器\u.py
pb3s4cty5#
更有效地——你可以使用spark来计算行数。下面的代码段有助于计算行数。
显示行数。
Note: The data in different part files will not overlap
使用hdfs dfs -cat /bdatest/clm/data/part-* | wc -l
也会给你的输出,但这将转储所有的数据到本地机器,需要更长的时间。最好的解决方案是使用mapreduce或spark。mapreduce的开发和执行将花费较长的时间。如果安装了Spark,这是最好的选择。
bjp0bcyl6#
这是一个非常常见的任务,我希望在fs中有一个子命令来完成它(例如。
hadoop fs -wc -l inputdir
)避免将所有内容流式传输到执行“wc-l”命令的一台计算机。为了有效地计算行数,我经常使用hadoop流和unix命令,如下所示:
每个Map器将运行“wc-l”的部分,它有,然后一个单一的减速机将汇总所有Map器的计数。