• Официальный сайт SDK
  • Сайт с примерами кода

Массовая загрузка данных

Густав Франко, администратор Google Systems
Апрель 2008

Введение

С помощью утилиты массовой загрузки данных, которая включена в состав SDK, становится возможным производить потоковую загрузку данных из файлов CSV и конвертировать их в объекты хранилища приложения. Одновременно при выполнении этой операции можно указать, какие из объектов будут доступны для поиска.

В этой статье мы рассмотрим создание программы, которая производит поиск заданного ключевого слова в данных хранилища. Затем мы покажем, как можно использовать загрузчик для потоковой загрузки данных в наше приложение.

Наша программа: Поиск объектов хранилище по ключевому слову

Сначала, давайте напишем программу, которая выполняет поиск заданного ключевого слова в объектах хранилища и возвращает все результаты, которые совпадают с этим словом:

import wsgiref.handlers
from google.appengine.ext import webapp
from google.appengine.ext import searchclass MainPage(webapp.RequestHandler):
  def get(self):
    # Используем фреймворк webapp для получения параметра keyword
    keyword = self.request.get('keyword')    self.response.headers['Content-Type'] = 'text/plain'
    if not keyword:
      self.response.out.write("No keyword has been set")
    else:
      # Ищем в объектах 'Person' заданное ключевое слово
      query = search.SearchableQuery('Person')
      query.Search(keyword)
      for result in query.Run():
         self.response.out.write('%s' % result['email'])def main():
  application = webapp.WSGIApplication([('/', MainPage)],
                                       debug=True)
  wsgiref.handlers.CGIHandler().run(application)if __name__ == "__main__":
  main()

Все замечательно, огорчает только тот момент, что пока наше приложение не содержит в себе никаких данных! Далее я объясню, как можно организовать загрузку данных в ваше приложение.

Обзор потокового загрузчика данных

Потоковый модуль загрузки данных доступен в пакете google.appengine.ext.bulkload и позволяет вам импортировать в приложение внешние данные. Он выполняет чтение CSV файла, отправляет данные в приложение, которое конвертирует каждую строку файла в отдельный объект и помещает его в хранилище. Дополнительно можно указать загрузчику, какие их объектов следует сделать доступными для поиска.

Для использования этого модуля в приложении, мы создадим загрузчик, который описывает данные с помощью модели. Затем добавим определение обработчика этого загрузчика в файл app.yaml. В завершении, воспользуемся программой tools/bulkload_client.py для проведения загрузки данных в хранилище.

Создание загрузчика для модели данных

Давайте создадим наш загрузчик данных в файле myloader.py. Код, указанный ниже, определяет загрузчик данных из формата CSV, а также указывает на то, что данные должны быть проиндексированы.

Этот обработчик создает новый класс, который является потомком класса Loader и переопределяет его метод HandleEntity. Наш новый метод HandleEntity будет помечать все объекты как индексируемые.

from google.appengine.ext import bulkload
from google.appengine.api import datastore_types
from google.appengine.ext import searchclass PersonLoader(bulkload.Loader):
  def __init__(self):
    # Наш объект 'Person' содержит строку с именем и адресом электронной почты
    bulkload.Loader.__init__(self, 'Person',
                         [('name', str),
                          ('email', datastore_types.Email),
                          ])  def HandleEntity(self, entity):
    ent = search.SearchableEntity(entity)
    return entif __name__ == '__main__':
  bulkload.main(PersonLoader())

Наш CSV файл с данными для загрузки будет выглядеть следующим образом:

John, [email protected]
Mary, [email protected]
William, [email protected]
...

Добавление загрузчика в конфигурацию проекта

Поскольку загрузка данных в приложение будет производиться через метод POST и URL /load, мы должны добавить информацию о новом обработчике из файла myloader.py в конфигурацию приложения в файле app.yaml:

- url: /load
  script: myloader.py
  login: admin

Загрузка CSV данных в приложение

Теперь, когда мы подготовили наше приложение и его загрузчик, мы можем запустить его с помощью сервера разработки dev_appserver.py. После того, как приложение будет запущено, мы можем отправлять данные в формате CSV в приложение, после чего они попадут в хранилище.

Утилита для потоковой загрузки входит в состав SDK (tools/bulkload_client.py). Этот скрипт на языке Python осуществляет построчное чтение CSV файла, после чего выполняет загрузку каждой порции данных в приложение. Для загрузки CSV файла (people.csv) в приложение, работающее на сервер разработки, вы можете использовать следующую команду:

./bulkload_client.py --filename people.csv \
                     --kind Person \
                     --url http://localhost:8080/load

После чего процесс будет выполнен. Теперь можно перейти по адресу http://localhost:8080/?keyword=William, и мы увидим следующий результат в браузере:

[email protected]