2012-06-10 18 views
15

उनके पास कई 100'000 वस्तुओं के साथ एक GAE डेटास्टोर प्रकार है। कई शामिल प्रश्न पूछना चाहते हैं (गिनती प्रश्नों को शामिल करना)। बड़ी सवाल यह है कि ऐसा करने के लिए एक भगवान फिट है।Google ऐप इंजन: डेटास्टोर पर बड़ी क्वेरी का उपयोग करना?

क्या वर्तमान में बिग क्वेरी का उपयोग करके लाइव एपइंजिन डेटास्टोर से पूछताछ करने का एक आसान तरीका है?

उत्तर

17

आप सीधे डेटास्टोर इकाइयां पर एक BigQuery नहीं चला सकते हैं, लेकिन आप एक मैपर पाइपलाइन कि डेटास्टोर से बाहर संस्थाओं पढ़ता है, Google मेघ संग्रहण में सीएसवी करने के लिए उन्हें लिखते हैं, और उसके बाद BigQuery में उन ग्रहण करता लिख ​​सकते हैं - तुम भी स्वचालित कर सकते हैं प्रक्रिया।

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's 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 वर्ग के अंत करने के लिए इस संलग्न हैं:: यहाँ सीएसवी कदम करने के लिए सिर्फ डेटासंग्रह के लिए Mapper API वर्गों का उपयोग का एक उदाहरण है yield CloudStorageToBigQuery(output), आप कर सकते हैं पाइप एक BigQuery घूस पाइप में जिसके परिणामस्वरूप सीएसवी filehandle। .. इस तरह:

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

नहीं, BigQuery एक अलग उत्पाद है जिसके लिए डेटा अपलोड करने की आवश्यकता है। यह डेटास्टोर पर काम नहीं कर सकता है। आप डेटास्टोर से पूछने के लिए जीक्यूएल का उपयोग कर सकते हैं।

3

BigQuery के लिए आपको उन प्रकारों को एक CSV या सीमित रिकॉर्ड संरचना में निर्यात करना होगा, BigQuery में लोड करें और आप क्वेरी कर सकते हैं। ऐसी कोई सुविधा नहीं है जिसे मैं जानता हूं जिसमें लाइव जीएई डाटास्टोर से पूछताछ की अनुमति मिलती है।

बाइकरी विश्लेषणात्मक क्वेरी इंजन है जिसका अर्थ है कि आप रिकॉर्ड नहीं बदल सकते हैं। कोई अपडेट या डिलीट की अनुमति नहीं है, आप केवल जोड़ सकते हैं।

5

हम दो सरल आपरेशनों में BigQuery में डेटास्टोर से ले जाने के लिए एक विश्वसनीय जांचकर्ता कार्यक्रम कर रहे हैं:

  1. बैकअप टी वह BigQuery

यह स्वचालित रूप से आप के लिए स्कीमा का ख्याल रखता है में सीधे

  • आयात बैकअप का उपयोग कर डेटासंग्रह डेटास्टोर व्यवस्थापक के बैकअप कार्यप्रणाली।

    अधिक जानकारी (लागू करने के लिए): https://docs.google.com/a/google.com/spreadsheet/viewform?formkey=dHdpeXlmRlZCNWlYSE9BcE5jc2NYOUE6MQ

  • +0

    तो इसका क्या हुआ? टीटीपी भाग्य पर कोई अपडेट? – gae123

    +0

    हाँ, यह थोड़ी देर हो गया है – ZiglioUK

    +0

    भी रुचि रखते हैं – Omri

    6

    के साथ नई (सितंबर 2013 से) streaming inserts api आप BigQuery में अपना ऐप्लिकेशन से रिकॉर्ड आयात कर सकते हैं।

    डेटा BigQuery में तुरंत उपलब्ध है, इसलिए इसे आपकी लाइव आवश्यकता को पूरा करना चाहिए।

    जबकि इस सवाल का अब थोड़ा पुराना है, इस इस सवाल

    भर में ठोकर फिलहाल हालांकि हो रही है कि यह एक से काम करने के लिए स्थानीय डेव सर्वर पर सबसे अच्छा विचित्र है किसी के लिए एक आसान समाधान हो सकता है।

    1

    2016 तक, यह अब बहुत संभव है! आप क्या करना चाहिए निम्नलिखित:

    1. बैकअप डेटाबेस व्यवस्थापक का उपयोग कर का उपयोग कर संस्थाओं console.developers.google.com मैं एक पूरा ट्यूटोरियल
    2. प्रमुख वेब UI BigQuery करने के लिए है पर गूगल भंडारण में एक नया बाल्टी बनाओ , और चरण 1 में उत्पन्न फ़ाइलों को आयात करें।

    इस वर्कफ़्लो के पूर्ण उदाहरण के लिए this post देखें!

    संबंधित मुद्दे