Google App Engine: использование большого запроса в хранилище данных?

Имейте тип хранилища GAE с несколькими 100 000 единиц объектов в них. Хотите сделать несколько связанных запросов (включая подсчет запросов). Большой запрос кажется богом, подходящим для этого.

Есть ли в настоящее время простой способ запроса Live AppEngine Datastore с помощью Big Query?

Ответы

Ответ 1

Вы не можете запускать BigQuery непосредственно в объектах DataStore, но вы можете написать протокол Mapper, который считывает сущности из DataStore, записывает их в CSV в Google Cloud Storage и затем глотает их в BigQuery - вы даже можете автоматизировать обработать. Здесь приведен пример использования классов Mapper API только для шага DataStore to CSV:

import re
import time
from datetime import datetime
import urllib
import httplib2
import pickle

from google.appengine.ext import blobstore
from google.appengine.ext import db
from google.appengine.ext import webapp

from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template

from mapreduce.lib import files
from google.appengine.api import taskqueue
from google.appengine.api import users

from mapreduce import base_handler
from mapreduce import mapreduce_pipeline
from mapreduce import operation as op

from apiclient.discovery import build
from google.appengine.api import memcache
from oauth2client.appengine import AppAssertionCredentials


#Number of shards to use in the Mapper pipeline
SHARDS = 20

# Name of the project Google Cloud Storage Bucket
GS_BUCKET = 'your bucket'

# DataStore Model
class YourEntity(db.Expando):
  field1 = db.StringProperty() # etc, etc

ENTITY_KIND = 'main.YourEntity'


class MapReduceStart(webapp.RequestHandler):
  """Handler that provides link for user to start MapReduce pipeline.
  """
  def get(self):
    pipeline = IteratorPipeline(ENTITY_KIND)
    pipeline.start()
    path = pipeline.base_path + "/status?root=" + pipeline.pipeline_id
    logging.info('Redirecting to: %s' % path)
    self.redirect(path)


class IteratorPipeline(base_handler.PipelineBase):
  """ A pipeline that iterates through datastore
  """
  def run(self, entity_type):
    output = yield mapreduce_pipeline.MapperPipeline(
      "DataStore_to_Google_Storage_Pipeline",
      "main.datastore_map",
      "mapreduce.input_readers.DatastoreInputReader",
      output_writer_spec="mapreduce.output_writers.FileOutputWriter",
      params={
          "input_reader":{
              "entity_kind": entity_type,
              },
          "output_writer":{
              "filesystem": "gs",
              "gs_bucket_name": GS_BUCKET,
              "output_sharding":"none",
              }
          },
          shards=SHARDS)


def datastore_map(entity_type):
  props = GetPropsFor(entity_type)
  data = db.to_dict(entity_type)
  result = ','.join(['"%s"' % str(data.get(k)) for k in props])
  yield('%s\n' % result)


def GetPropsFor(entity_or_kind):
  if (isinstance(entity_or_kind, basestring)):
    kind = entity_or_kind
  else:
    kind = entity_or_kind.kind()
  cls = globals().get(kind)
  return cls.properties()


application = webapp.WSGIApplication(
                                     [('/start', MapReduceStart)],
                                     debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

Если вы добавите это к концу своего класса IteratorPipeline: yield CloudStorageToBigQuery(output), вы можете передать полученный обработчик дескриптора csv в трубку для приема BigQuery... например:

class CloudStorageToBigQuery(base_handler.PipelineBase):
  """A Pipeline that kicks off a BigQuery ingestion job.
  """
  def run(self, output):

# BigQuery API Settings
SCOPE = 'https://www.googleapis.com/auth/bigquery'
PROJECT_ID = 'Some_ProjectXXXX'
DATASET_ID = 'Some_DATASET'

# Create a new API service for interacting with BigQuery
credentials = AppAssertionCredentials(scope=SCOPE)
http = credentials.authorize(httplib2.Http())
bigquery_service = build("bigquery", "v2", http=http)

jobs = bigquery_service.jobs()
table_name = 'datastore_dump_%s' % datetime.utcnow().strftime(
    '%m%d%Y_%H%M%S')
files = [str(f.replace('/gs/', 'gs://')) for f in output]
result = jobs.insert(projectId=PROJECT_ID,
                    body=build_job_data(table_name,files)).execute()
logging.info(result)

def build_job_data(table_name, files):
  return {"projectId": PROJECT_ID,
          "configuration":{
              "load": {
                  "sourceUris": files,
                  "schema":{
                      # put your schema here
                      "fields": fields
                      },
                  "destinationTable":{
                      "projectId": PROJECT_ID,
                      "datasetId": DATASET_ID,
                      "tableId": table_name,
                      },
                  }
              }
          }

Ответ 2

С новым (с сентября 2013 г.) потоковыми вставками api вы можете импортировать записи из своего приложения в BigQuery.

Данные доступны в BigQuery сразу, поэтому это должно удовлетворять вашим живым требованиям.

Пока этот вопрос немного устарел, это может быть более легким решением для тех, кто наткнулся на этот вопрос

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

Ответ 3

Мы выполняем программу Trusted Tester для перехода от Datastore к BigQuery двумя простыми операциями:

  • Резервное копирование хранилища данных с использованием функции резервного копирования Datastore Admin
  • Импорт резервной копии непосредственно в BigQuery

Он автоматически заботится о схеме для вас.

Дополнительная информация (для заявки): https://docs.google.com/a/google.com/spreadsheet/viewform?formkey=dHdpeXlmRlZCNWlYSE9BcE5jc2NYOUE6MQ

Ответ 4

Для BigQuery вам нужно экспортировать эти Kind в CSV или структуру разделенных записей, загрузите в BigQuery и вы можете запросить. Нет никакого объекта, который я знаю, который позволяет запрашивать реальное хранилище данных GAE.

Biquery - это механизм аналитических запросов, который означает, что вы не можете изменить запись. Не разрешено обновление или удаление, вы можете добавлять только.

Ответ 5

Нет, BigQuery - это другой продукт, которому нужны данные для загрузки на него. Он не может работать над хранилищем данных. Вы можете использовать GQL для запроса хранилища данных.

Ответ 6

Начиная с 2016 года, это возможно сейчас! Вы должны сделать следующее:

  • Создайте новый ковш в хранилище Google.
  • Резервные объекты, использующие администратор базы данных на console.developers.google.com. У меня есть полный учебник.
  • Перейдите к веб-интерфейсу bigquery Web и импортируйте файлы, сгенерированные на шаге 1.

См. этот пост для полного примера этого рабочего процесса!