2017-02-27 42 views
1

我想读使用Python在HDFS目录中的文件读取HDFS目录中的文件。我使用下面的代码,但我得到错误。如何使用python

代码

cat = Popen(["hadoop", "fs", "-cat", "/user/cloudera/CCMD"], stdout=PIPE) 

错误

cat: `/user/cloudera/CCMD': Is a directory 
Traceback (most recent call last): 
    File "hrkpat.py", line 6, in <module> 
    tree = ET.parse(cat.stdout) 
    File "/usr/lib64/python2.6/xml/etree/ElementTree.py", line 862, in parse 
    tree.parse(source, parser) 
    File "/usr/lib64/python2.6/xml/etree/ElementTree.py", line 587, in parse 
    self._root = parser.close() 
    File "/usr/lib64/python2.6/xml/etree/ElementTree.py", line 1254, in close 
    self._parser.Parse("", 1) # end of data 
xml.parsers.expat.ExpatError: no element found: line 1, column 0 

更新:

我有10-15 XML文件在我HDFS目录,我想要t o解析。我能够解析XML时只有一个XML出现在目录中,但只要我有文件的多个号码我不能够解析XML。对于这种用例,我想编写Python代码,这样我就可以从我的目录中解析出一个文件,并且一旦我解析它就会移到下一个文件。

回答

1

例外是cat: '/user/cloudera/CCMD': Is a directory

您正在尝试通过目录进行文件操作。将文件的路径传递给命令。

使用此命令在subprocess代替,

hadoop fs -cat /user/cloudera/CCMD/filename 
+0

文件名可以不同,但​​文件保存的目录是相同的,这就是为什么我想要在路径中提供目录名称而不是文件名。 – animal

+0

我想要读取的目录中有多个文件,而不是单个文件。 – animal

+0

然后'hadoop fs -cat'不是你的命令。获取hdfs目录中的文件列表并使用检索到的文件名读取它们。买为什么?你为什么试图从hdfs读取文件?对于读取数据的下一阶段处理,如果是,请尝试写入MapReduce。 – franklinsijo

1

您可以使用通配符字符*读取所有文件目录:

hadoop fs -cat /user/cloudera/CCMD/* 

或者只是读取XML文件:

hadoop fs -cat /user/cloudera/CCMD/*.xml 
+0

它的工作原理是如果目录有一个文件,但是当我在目录中有多个xml文件时,它会抛出错误。 'tree = ET.parse(cat.stdout) 文件“/usr/lib64/python2.6/xml/etree/ElementTree.py”,第862行,解析 xml.parsers.expat.ExpatError:垃圾文件后的垃圾元素:第12266行,第19列 [cloudera @ server〜] $ cat:无法写入输出流。 cat:无法写入输出流。' – animal

+0

读取'hdfs'中的所有文件很好,使用'*'但[看到这个](https://www.knowbigdata.com/page/hdfs-hadoop-fs-cat -error-unable-write-output-stream) –

+0

'hadoop fs -cat/user/cloudera/CCMD/*'这个命令会逐个读取所有文件或者一次读取一个文件? – animal