使用Appengine将数据流式传输到Bigquery

时间:2018-05-09 08:16:26

标签: google-bigquery google-app-engine-python

我使用App Engine中的Python代码使用流式方法收集BigQuery中的数据(源自某些网站中安装的Cookie)。 我用来保存数据的功能如下:

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 :(得分:0)

使用insertAll()方法时,您必须牢记这一点:

  

数据在流缓冲区中临时流式传输   与托管存储不同的可用性特征。某些   BigQuery中的操作不会与流缓冲区交互,例如   作为表复制作业和API方法,如tabledata.list {1}

如果您正在使用表格预览,则可能无法看到流式缓冲条目。

从表中执行SELECT COUNT(*)应返回您的总条目数。

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

答案 1 :(得分:0)

在您的代码中,insertAll操作期间没有查询异常处理。如果BigQuery无法写入数据,则不会捕获异常。

在最后一行中尝试以下代码:

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

通过这种方式,在Google Cloud Platform日志中,您可以轻松地在insertAll操作中找到可能的错误。