Как сохранить входящий файл в api бутылки в hdfs
Я определяю bottle
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.file
является объектом типа cStringIO.StringO
который может быть преобразован в str
с .read()
метод. Но hadoopy.writetb(path, content)
ожидает, что контент будет в каком-то другом формате, и сервер остановится на этом этапе. Это не дает исключения, это не дает ошибки или какого-либо результата. Просто стоит там, как будто это было в бесконечном цикле.
Кто-нибудь знает, как записать входящий файл в бутылке API в HDFS?
1 ответ
Из документации Hadoopy это выглядит как второй параметр 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.)