| Index: third_party/grpc/tools/gcp/utils/big_query_utils.py
|
| diff --git a/third_party/grpc/tools/gcp/utils/big_query_utils.py b/third_party/grpc/tools/gcp/utils/big_query_utils.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..7bb1e143549154279e3e90b8b5d93871303ec0b6
|
| --- /dev/null
|
| +++ b/third_party/grpc/tools/gcp/utils/big_query_utils.py
|
| @@ -0,0 +1,140 @@
|
| +#!/usr/bin/env python2.7
|
| +# Copyright 2015-2016, Google Inc.
|
| +# All rights reserved.
|
| +#
|
| +# Redistribution and use in source and binary forms, with or without
|
| +# modification, are permitted provided that the following conditions are
|
| +# met:
|
| +#
|
| +# * Redistributions of source code must retain the above copyright
|
| +# notice, this list of conditions and the following disclaimer.
|
| +# * Redistributions in binary form must reproduce the above
|
| +# copyright notice, this list of conditions and the following disclaimer
|
| +# in the documentation and/or other materials provided with the
|
| +# distribution.
|
| +# * Neither the name of Google Inc. nor the names of its
|
| +# contributors may be used to endorse or promote products derived from
|
| +# this software without specific prior written permission.
|
| +#
|
| +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| +import argparse
|
| +import json
|
| +import uuid
|
| +import httplib2
|
| +
|
| +from apiclient import discovery
|
| +from apiclient.errors import HttpError
|
| +from oauth2client.client import GoogleCredentials
|
| +
|
| +NUM_RETRIES = 3
|
| +
|
| +
|
| +def create_big_query():
|
| + """Authenticates with cloud platform and gets a BiqQuery service object
|
| + """
|
| + creds = GoogleCredentials.get_application_default()
|
| + return discovery.build('bigquery', 'v2', credentials=creds)
|
| +
|
| +
|
| +def create_dataset(biq_query, project_id, dataset_id):
|
| + is_success = True
|
| + body = {
|
| + 'datasetReference': {
|
| + 'projectId': project_id,
|
| + 'datasetId': dataset_id
|
| + }
|
| + }
|
| +
|
| + try:
|
| + dataset_req = biq_query.datasets().insert(projectId=project_id, body=body)
|
| + dataset_req.execute(num_retries=NUM_RETRIES)
|
| + except HttpError as http_error:
|
| + if http_error.resp.status == 409:
|
| + print 'Warning: The dataset %s already exists' % dataset_id
|
| + else:
|
| + # Note: For more debugging info, print "http_error.content"
|
| + print 'Error in creating dataset: %s. Err: %s' % (dataset_id, http_error)
|
| + is_success = False
|
| + return is_success
|
| +
|
| +
|
| +def create_table(big_query, project_id, dataset_id, table_id, table_schema,
|
| + description):
|
| + is_success = True
|
| +
|
| + body = {
|
| + 'description': description,
|
| + 'schema': {
|
| + 'fields': [{
|
| + 'name': field_name,
|
| + 'type': field_type,
|
| + 'description': field_description
|
| + } for (field_name, field_type, field_description) in table_schema]
|
| + },
|
| + 'tableReference': {
|
| + 'datasetId': dataset_id,
|
| + 'projectId': project_id,
|
| + 'tableId': table_id
|
| + }
|
| + }
|
| +
|
| + try:
|
| + table_req = big_query.tables().insert(projectId=project_id,
|
| + datasetId=dataset_id,
|
| + body=body)
|
| + res = table_req.execute(num_retries=NUM_RETRIES)
|
| + print 'Successfully created %s "%s"' % (res['kind'], res['id'])
|
| + except HttpError as http_error:
|
| + if http_error.resp.status == 409:
|
| + print 'Warning: Table %s already exists' % table_id
|
| + else:
|
| + print 'Error in creating table: %s. Err: %s' % (table_id, http_error)
|
| + is_success = False
|
| + return is_success
|
| +
|
| +
|
| +def insert_rows(big_query, project_id, dataset_id, table_id, rows_list):
|
| + is_success = True
|
| + body = {'rows': rows_list}
|
| + try:
|
| + insert_req = big_query.tabledata().insertAll(projectId=project_id,
|
| + datasetId=dataset_id,
|
| + tableId=table_id,
|
| + body=body)
|
| + print body
|
| + res = insert_req.execute(num_retries=NUM_RETRIES)
|
| + print res
|
| + except HttpError as http_error:
|
| + print 'Error in inserting rows in the table %s' % table_id
|
| + is_success = False
|
| + return is_success
|
| +
|
| +
|
| +def sync_query_job(big_query, project_id, query, timeout=5000):
|
| + query_data = {'query': query, 'timeoutMs': timeout}
|
| + query_job = None
|
| + try:
|
| + query_job = big_query.jobs().query(
|
| + projectId=project_id,
|
| + body=query_data).execute(num_retries=NUM_RETRIES)
|
| + except HttpError as http_error:
|
| + print 'Query execute job failed with error: %s' % http_error
|
| + print http_error.content
|
| + return query_job
|
| +
|
| + # List of (column name, column type, description) tuples
|
| +def make_row(unique_row_id, row_values_dict):
|
| + """row_values_dict is a dictionary of column name and column value.
|
| + """
|
| + return {'insertId': unique_row_id, 'json': row_values_dict}
|
|
|