2016-10-19 8 views
1

hdfs3モジュールを使用してPythonでHDFS上のファイルを読み込もうとしています。hdfs3でファイルを読み込めません。

import hdfs3 
hdfs = hdfs3.HDFileSystem(host='xxx.xxx.com', port=12345) 
hdfs.ls('/projects/samplecsv/part-r-00000') 

これは、だから、HDFSにアクセスし、ディレクトリ構造を読み取ることができるようです

[{'block_size': 134345348, 
    'group': 'supergroup', 
    'kind': 'file', 
    'last_access': 1473453452, 
    'last_mod': 1473454723, 
    'name': '/projects/samplecsv/part-r-00000/', 
    'owner': 'dr', 
    'permissions': 420, 
    'replication': 3, 
    'size': 98765631}] 

を生成します。ただし、ファイルの読み取りは失敗します。

with hdfs.open('/projects/samplecsv/part-r-00000', 'rb') as f: 
    print(f.read(100)) 

が問題である可能性があり何

--------------------------------------------------------------------------- 
OSError         Traceback (most recent call last) 
<ipython-input-94-46f0db8e87dd> in <module>() 
     1 with hdfs.open('/projects/samplecsv/part-r-00000', 'rb') as f: 
----> 2  print(f.read(100)) 

/anaconda3/lib/python3.5/site-packages/hdfs3/core.py in read(self, length) 
    615      length -= ret 
    616     else: 
--> 617      raise IOError('Read file %s Failed:' % self.path, -ret) 
    618 
    619   return b''.join(buffers) 
OSError: [Errno Read file /projects/samplecsv/part-r-00000 Failed:] 1 

を与えますか?私はPython3.5を使用しています。

+1

なぜあなたはトレースバックを切り取るましたか?ファイルへの読み取りアクセス権はありますか? –

+0

私は上記の完全な出力を追加しました。私はファイルへの読み取りアクセス権を持っています。 'サブプロセス 'を使ってhdfsコマンドを起動すると、ファイルの内容を見ることができます。ありがとう。 – Linda

答えて

2

ファイルに対して操作を行う場合は、完全なファイルパスを渡す必要があります。場合

import hdfs3 
hdfs = hdfs3.HDFileSystem(host='xxx.xxx.com', port=12345) 
hdfs.ls('/projects/samplecsv/part-r-00000') 

#you have to add file to location 
hdfs.put('local-file.txt', '/projects/samplecsv/part-r-00000') 

with hdfs.open('projects/samplecsv/part-r-00000/local-file.txt', 'rb') as f: 
    print(f.read(100)) 
+0

hdfsから複数のxmlファイルを読み込む必要がある場合、ローカルとその作業の両方で、同じようにglob.iglob(os.path.join(xml_dir_path、 '* .xml'))内のファイルに対して:ファイル)をf:f.read(100) '任意のアイデアですか? – user07

+0

他の人に役立つ場合に備えて私の質問に対する回答を掲載しました – user07

1

あなたはHDFSから複数のファイルを読みたい場合は、例の下に試すことができdirecotory:

import hdfs3 
    hdfs = hdfs3.HDFileSystem(host='xxx.xxx.com', port=12345) 
    hdfs.ls('/projects/samplecsv/part-r-00000') 

    #you have to add file to location if its not present. 
    hdfs.put('local-file.txt', '/projects/samplecsv/part-r-00000') 

    file_loc = '/projects/samplecsv/part-r-00000' 
    for file in hdfs.glob(os.path.join(file_loc , '*.txt')): 
     with hdfs.open(file) as f: 
      print(f.read(100)) 
関連する問題