Как сохранить входящий файл в 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.)

Другие вопросы по тегам