【问题标题】:Loading a Lot of Data into Google Bigquery from Python从 Python 将大量数据加载到 Google Bigquery 中
【发布时间】:2014-07-09 08:44:43
【问题描述】:

一段时间以来,我一直在努力将大量数据加载到 bigquery 中。在 Google 的文档中,我看到了 insertAll 方法,它似乎工作正常,但是当我尝试以 JSON 格式发送超过 100k 的数据时,会出现 413“实体太大”错误。 Per Google's docs, I should be able to send up to 1TB of uncompressed data in JSON。是什么赋予了?上一页的示例让我手动构建请求正文,而不是使用 insertAll,后者更丑陋且更容易出错。我也不确定在这种情况下数据应该采用什么格式。

那么,综上所述,将大量数据加载到 Bigquery 中的干净/正确方法是什么?一个有数据的例子会很棒。如果可能的话,我真的不想自己构建请求正文。

【问题讨论】:

  • 源数据的格式是什么?
  • @Rohit 没关系。只是我要插入 bigquery 的数据。例如,插入任何数据都应该没问题。

标签: python google-bigquery


【解决方案1】:

示例here 使用可恢复上传来上传 CSV 文件。虽然使用的文件很小,但它应该适用于几乎任何大小的上传,因为它使用了强大的媒体上传协议。听起来您想要 json,这意味着您需要稍微调整 json 的代码(json 的示例在同一目录中的 load_json.py 示例中)。如果您要上传流而不是文件,则可以使用MediaInMemoryUpload 代替示例中使用的MediaFileUpload

顺便说一句......克雷格的回答是正确的,我只是想我会附上示例代码的链接。

【讨论】:

  • 那个例子好像被移动了。你能更新你的答案吗?
  • 媒体链接均已损坏且 MediaInMemoryUpload 表示已弃用
【解决方案2】:

请注意,要将数据流式传输到 BQ,anything above 10k rows/sec 需要与销售代表交谈。

如果您想直接将大块发送到 BQ,您可以send it via POST。如果您使用的是客户端库,它应该为您处理使上传恢复的问题。为此,您需要调用jobs.insert() 而不是tabledata.insertAll(),并提供load job 的描述。要使用 Python 客户端实际推送字节,您可以创建 MediaFileUploadMediaInMemoryUpload 并将其作为 media_body 参数传递。

另一种选择是将数据暂存到 Google Cloud Storage 和 load it from there

【讨论】:

  • 我不想流式传输数据。理想情况下,我会分几块加载它。除了使用云存储之外,有没有办法做到这一点?我的公司目前没有将 Cloud Storage 用于任何用途,首先将其加载到那里似乎是一个完全额外且不必要的步骤。
  • 当然——你可以直接通过POST发送。不过,如果您已经将文件放在某个地方,gsutil 可以让这一切变得非常简单(它们可以处理并行上传等事情,而无需您做任何工作)。
  • 我确实有一个客户端库。我为此使用 Python,但据我所知, insertAll 是这样做的唯一方法。我在看developers.google.com/resources/api-libraries/documentation/…。这就是最初的问题的来源。
  • 您也可以使用load 作业调用jobs.insert(),并使用MediaFileUploadMediaInMemoryUpload 传递media_body 参数。
  • 只是跟进:克雷格的回答是正确的,但所有这些东西都没有很好的记录。如果谷歌的任何人在听,它几乎没有说insertAll() 仅用于流媒体,为什么没有jobs.insert() 用于加载数据的示例,尤其是在developers.google.com/bigquery/… 上,我无法理解。由于糟糕的文档,我在本应简单的任务上花费了比必要的时间更长的时间,这并没有让我想继续使用 BigQuery。
猜你喜欢
  • 2023-03-26
  • 2019-07-28
  • 1970-01-01
  • 2018-12-27
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
相关资源
最近更新 更多