将数据从Google Search控制台API流式传输到BigQuery

时间:2018-04-11 07:35:07

标签: google-cloud-platform google-bigquery google-cloud-pubsub

因此,我一直在尝试实时将Google Search Console API中的数据流式传输到BigQuery

从GSC API检索数据并将其流式传输到BigQuery流缓冲区。但是,在刷新流式缓冲区之前,我会遇到高延迟(最多2小时或更长时间)。因此,数据保留在流缓冲区中,但不在表中。 数据在预览中也不可见,表格大小为0B,有0行(实际上在等待> 1天后,即使有超过0行,我仍然看到0B)。

另一个问题是,在数据存储在表中之后的某个时间(表大小和行数是正确的),它只是从它中消失并出现在流缓冲区中(我只看过一次)。 - > shollyman的答案中的第二个子弹解释了这一点。

我想要的是实时显示表格中的数据。根据文档,这似乎是可能的,但在我的情况下不起作用(延迟2小时,如上所述) 。

以下是负责该部分的代码:

for row in response['rows']:
     keys = ','.join(row['keys'])

     # Data Manipulation Languate (DML) Insert one row each time to BigQuery
     row_to_stream = {'keys':keys, 'f1':row['f1'], 'f2':row['f2'], 'ctr':row['ctr'], 'position':row['position']}                    
     insert_all_data = {
         "kind": "bigquery#tableDataInsertAllRequest",
         "skipInvaliedRows": True,
         "ignoreUnknownValues": True,
         'rows':[{
                        'insertId': str(uuid.uuid4()),
                        'json': row_to_stream,
                    }]
     }

     build('bigquery', 'v2', cache_discovery=False).tabledata().insertAll(
         projectId=projectid,
         datasetId=dataset_id,
         tableId=tableid,
         body=insert_all_data).execute(num_retries=5)

我在这里看到过与我的相似的问题,但我还没找到答案。因此,我有两个问题。

1。什么可能导致这个问题?

另外,我是GCP的新手,我已经看到了其他选项(至少他们看起来像我的选项),可以将数据实时流式传输到BigQuery(例如,使用PubSub和一些项目)实时Twitter数据分析)。

2。您如何为特定任务选择最佳选择?

1 个答案:

答案 0 :(得分:2)

  • 默认情况下,BigQuery Web UI不会自动刷新表的状态。单击表格的详细信息时,会出现刷新按钮,该按钮应显示托管存储和流缓冲区的更新大小信息(显示在主表详细信息下方)。缓冲区中的行可用于查询,但在将某些数据从流缓冲区提取到托管存储区之前,预览按钮可能不会显示结果。

  • 我怀疑您观察到的数据从托管存储中消失并在流式缓冲区中显示的情况可能是表格被删除并使用相同的名称重新创建,或者以某种方式被截断重新启动。数据不会从托管存储转换回缓冲区。

  • 决定使用哪种技术进行流式传输取决于您的需求。如果您有多个信息使用者(多个发布/订阅订阅者独立地使用相同的消息流),或者您需要在生产者和使用者之间应用其他数据转换,则Pub / Sub是一个很好的选择。要将数据从pub / sub获取到BigQuery,您仍然需要订阅者将消息写入BigQuery,因为这两者没有直接集成。