我使用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中。你对这个问题有任何想法吗?
答案 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操作中找到可能的错误。