在Scala中,我试图从Hdfs目录中计数文件。我试图获得val files = fs.listFiles(path, false)
的文件列表,并对其进行计数或获取它的大小,但它不起作用,因为files
类型是RemoteIterator[LocatedFileStatus]
你知道我应该怎么处理吗?
谢谢你的帮助
这是以前做过的,但通常人们使用FSImage。(名称节点文件的副本)
他们会把它扔到一个hive表中,然后你可以查询hdfs文件系统的信息。
这是一个非常好的教程,它解释了如何导出fimage并将其放入hive表中。
还有一个我更喜欢的:
获取并复制fsimage文件到HDFS#以HDFS用户连接任意hadoop集群节点
#downloads the fsimage file from namenode hdfs dfsadmin -fetchImage /tmp #converts the fsimage file into tab delimited file hdfs oiv -i /tmp/fsimage_0000000000450297390 -o /tmp/fsimage.csv -p Delimited #remove the header and copy to HDFS sed -i -e "1d" fsimage.csv hdfs dfs -mkdir /tmp/fsimage hdfs dfs -copyFromLocal /tmp/fsimage.csv /tmp/fsimage #create the intermediate external table in impala CREATE EXTERNAL TABLE HDFS_META_D ( PATH STRING , REPL INT , MODIFICATION_TIME STRING , ACCESSTIME STRING , PREFERREDBLOCKSIZE INT , BLOCKCOUNT DOUBLE, FILESIZE DOUBLE , NSQUOTA INT , DSQUOTA INT , PERMISSION STRING , USERNAME STRING , GROUPNAME STRING) row format delimited fields terminated by 't' LOCATION '/tmp/fsimage';
一旦它被放入表中,你就可以在scala/spark中完成剩下的工作了。
我最终使用:
var count: Int = 0
while (files.hasNext) {
files.next
count += 1
}
作为一个Scala初学者,我不知道如何制作count++
(答案是count += 1
)。这实际上运行得很好