通过 bigquery-python 库向 BigQuery 插入大量数据
Posted
技术标签:
【中文标题】通过 bigquery-python 库向 BigQuery 插入大量数据【英文标题】:Insert large amount of data to BigQuery via bigquery-python library 【发布时间】:2016-12-22 15:06:15 【问题描述】:我有大型 csv 文件和 excel 文件,我在其中读取它们并根据其具有的字段和类型动态创建所需的创建表脚本。然后将数据插入到创建的表中。
我已阅读this 并了解我应该使用jobs.insert()
而不是tabledata.insertAll()
发送大量数据。
这就是我所说的(适用于较小的文件而不是较大的文件)。
result = client.push_rows(datasetname,table_name,insertObject) # insertObject is a list of dictionaries
当我使用库的 push_rows 时,它会在 Windows 中出现此错误。
[Errno 10054] An existing connection was forcibly closed by the remote host
这在 ubuntu 中。
[Errno 32] Broken pipe
所以当我查看BigQuery-Python 代码时,它使用table_data.insertAll()
。
我怎样才能用这个库做到这一点?我知道我们可以通过 Google 存储上传,但我需要直接上传。
【问题讨论】:
【参考方案1】:在处理大文件时,不要使用流式传输,而是使用批量加载:流式传输可以轻松处理高达每秒 100,000 行的数据。这对于流式传输非常有用,但不适用于加载大文件。
链接的示例代码正在做正确的事情(批处理而不是流),所以我们看到的是一个不同的问题:此示例代码试图将所有这些数据直接加载到 BigQuery,但通过 POST 部分上传失败。 gsutil
具有比普通 POST 更强大的上传算法。
解决方案:不要通过 POST 加载大块数据,而是先将它们暂存到 Google Cloud Storage 中,然后告诉 BigQuery 从 GCS 读取文件。
另见BigQuery script failing for large file
【讨论】:
您刚刚添加了 OP 的链接吗?! 哎呀,修复递归! @FelipeHoffa gsutil 我可以在 python 代码中使用吗?直接给出 csv 文件路径并上传时存在一些列类型问题。所以我可以读取 csv 并相应地转换字段。有没有办法在我投射对象(可能是字典列表)之后将它们插入到表中?以上是关于通过 bigquery-python 库向 BigQuery 插入大量数据的主要内容,如果未能解决你的问题,请参考以下文章