从Python将大量数据加载到Google BigQuery
我最近一直在尝试把大量数据加载到BigQuery中,但遇到了一些麻烦。在谷歌的文档里,我看到了一个叫做 insertAll 的方法,感觉这个方法应该没问题,但当我尝试发送超过10万的数据时,总是收到413的错误提示,意思是“实体太大”。而根据谷歌的文档,我应该可以发送最多1TB的未压缩JSON数据。这是怎么回事呢?之前页面上的例子让我手动构建请求体,而不是使用insertAll,这样做既麻烦又容易出错。我也不太确定在这种情况下数据应该是什么格式。
所以,综上所述,加载大量数据到BigQuery的正确方法是什么呢?如果能有个带数据的例子就更好了。如果可以的话,我真的不想自己构建请求体。
2 个回答
这个例子在这里展示了如何使用可恢复上传来上传一个CSV文件。虽然这个文件很小,但实际上这个方法适用于几乎任何大小的文件上传,因为它使用了一种很强大的媒体上传协议。听起来你想要的是json格式的文件,这样的话你需要稍微调整一下代码来适应json格式(在同一个目录下的load_json.py例子中有json的示例)。如果你想上传的是一个流而不是文件,你可以使用MediaInMemoryUpload,而不是示例中使用的MediaFileUpload。
顺便说一下……Craig的回答是正确的,我只是想补充一些示例代码的链接。
注意,如果你想把数据流式传输到BigQuery(BQ),那么每秒超过1万行的数据就需要联系销售代表了。
如果你想直接发送大量数据到BQ,可以通过使用POST
请求来实现。如果你在用客户端库,它会帮你处理上传的续传功能。为了做到这一点,你需要调用jobs.insert()
,而不是tabledata.insertAll()
,并提供一个load
作业的描述。要用Python客户端实际上传数据,你可以创建一个MediaFileUpload
或MediaInMemoryUpload
,并将其作为media_body
参数传递。
另一种选择是把数据先放在Google Cloud Storage中,然后从那里加载数据。