Потоковая передача данных в Bigquery с помощью Appengine - PullRequest
0 голосов
/ 09 мая 2018

Я собираю данные (полученные из файлов cookie, установленных на некоторых веб-сайтах) в BigQuery, используя потоковый подход с кодом Python в App Engine. Функция, которую я использую для сохранения данных, следующая:

def stream_data(data):
    PROJECT_ID = "project_id"
    DATASET_ID = "dataset_id"

    _SCOPE = 'https://www.googleapis.com/auth/bigquery'

    credentials = appengine.AppAssertionCredentials(scope=_SCOPE)
    http = credentials.authorize(httplib2.Http())
    table = "table_name"
    body = {
            "ignoreUnknownValues": True,                  
            "kind": "bigquery#tableDataInsertAllRequest", 
            "rows": [ 
            { 
                "json": data,
            },
            ]
        }
    bigquery = discovery.build('bigquery', 'v2', http=http)
    bigquery.tabledata().insertAll(projectId=PROJECT_ID, datasetId=DATASET_ID, tableId=table, body=body).execute()

Я развернул решение на двух разных экземплярах App Engine и получил разные результаты. Мой вопрос: как это возможно? С другой стороны, сравнивая результаты с метриками Google Analytics, я также заметил, что не все данные хранятся в BigQuery. Есть ли у вас какие-либо идеи по поводу этой проблемы?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

В вашем коде нет обработки исключений запроса во время операции insertAll. Если BigQuery не может записать данные, вы не поймаете исключение.

В последней строке попробуйте этот код:

bQreturn = bigquery.tabledata().insertAll(projectId=PROJECT_ID, datasetId=DATASET_ID, tableId=table, body=body).execute()
logging.debug(bQreturn)

Таким образом, в журнале Google Cloud Platform вы можете легко найти возможную ошибку в операции insertAll.

0 голосов
/ 09 мая 2018

При использовании метода insertAll() вы должны помнить об этом:

Данные временно передаются в потоковом буфере, который имеет другие характеристики доступности, чем управляемое хранилище. Определенный операции в BigQuery не взаимодействуют с потоковым буфером, например в качестве заданий копирования таблиц и методов API, таких как tabledata.list {1}

Если вы используете предварительный просмотр таблицы, потоковые буферизованные записи могут не отображаться.

Выполнение SELECT COUNT(*) из вашей таблицы должно вернуть ваше общее количество записей.

{1}: https://cloud.google.com/bigquery/troubleshooting-errors#missingunavailable-data

...