2017-09-08 75 views
0

我正在定義bottle api,我需要從客戶端接受文件,然後將該文件保存到本地系統上的HDFS。如何將傳入的文件保存在api中hdfs

代碼看起來像這樣。

@route('/upload', method='POST') 
def do_upload(): 
    import pdb; pdb.set_trace() 
    upload = request.files.upload 
    name, ext = os.path.splitext(upload.filename) 

    save_path = "/data/{user}/{filename}".format(user=USER, filename=name) 

    hadoopy.writetb(save_path, upload.file.read()) 
    return "File successfully saved to '{0}'.".format(save_path) 

的問題是,所述request.files.upload.filecStringIO.StringO類型可被轉化爲str.read()方法的對象。但hadoopy.writetb(path, content)預計內容是其他格式,服務器堅持在這一點上。它不會例外,它不會給出錯誤或任何結果。就像它在無限循環中一樣站在那裏。

有誰知道如何將輸入文件寫入HDFS的瓶子API?

+0

那麼,你是否改寫了WebHDFS,基本上? –

+0

不,我只想寫瓶apis,其中之一是文件上傳和讀取和HDFS。 –

回答

0

hadoopy documentation,它看起來像writetb的第二個參數應該是一對迭代;但你傳遞的是字節。

...的hadoopy.writetb命令這需要鍵/值對的迭代器...

您是否嘗試過通過一對?而不是你在做什麼,

hadoopy.writetb(save_path, upload.file.read()) # 2nd param is wrong 

試試這個:

hadoopy.writetb(save_path, (path, upload.file.read())) 

(我不熟悉使用Hadoop,所以它不是很清楚,我什麼path的語義,但據推測它」對於知道HDFS的人來說是有道理的。)

+0

路徑只是任何文件系統路徑字符串 –

+0

是的。 Path只是一個像'hdfs:// localhost:8082/root/data/files/foo'這樣的字符串,但事情是'upload.file.read()'給出'writetb'不接受的字符串! –

+0

@KeyurGolani您是否閱讀過'writetb'的API?第二個參數應該是一個元組,而不是一個字符串。我編輯了我的答案,使其更清晰。讓我知道它是否有效。 –

相關問題