使用 python 导出 BigQuery 数据进行分析

Posted

技术标签:

【中文标题】使用 python 导出 BigQuery 数据进行分析【英文标题】:Exporting BigQuery data for analysis using python 【发布时间】:2018-01-30 05:25:34 【问题描述】:

我是 Google BigQuery 的新手,所以我想了解如何最好地完成我的用例。

我有存储在 BigQuery 中的每日客户访问数据,我希望使用我用 Python 编写的一些算法来分析这些数据。由于有多个脚本使用每日数据的子集,我想知道获取和临时存储数据的最佳方式是什么。此外,脚本以顺序方式运行。每个脚本都会修改一些数据列,随后的脚本会使用这些修改后的数据。在所有脚本运行后,我想将修改后的数据存储回 BigQuery。

我想到的一些方法是:

    将 bigquery 表作为 db 文件导出到 GAE (Google App Engine) 实例中,并使用 sqlite3 python package 从 db 文件中查询每个脚本的相关数据。一旦所有脚本都运行完毕,将修改后的表存储回 BigQuery,然后从 GAE 实例中删除 db 文件。

    每次我想使用 google-cloud python client library 或 pandas gbq package 运行脚本时,都从 BigQuery 查询数据。运行每个脚本后修改 BigQuery 表。

有人可以知道其中哪一个是实现这一目标的更好方法(就效率/成本而言)或提出替代方案吗?

谢谢!

【问题讨论】:

这可能取决于几个因素,因此您可能需要测试一些选项以查看最适合您的选项。选项 1 将不起作用,因为 GAE 在大多数情况下是短暂的,因此您不能将其用作存储解决方案。选项2 是可能的,您也可以先将数据导出到GCS,然后从那里下载所有脚本(这可能会降低成本)。不过,如果您有大数据,那么您可能希望使用 Dataproc 而不是 pandas 来使用分布式处理来处理数据。 将您的代码带到数据中,而不是相反。 SQL 和/或 javascript (UDF) 可以为您完成这项工作吗? @WillianFuks:永久数据存储在 BigQuery 上,所以一旦所有 python 脚本运行,我想从 GAE 中删除数据。我不知道 Dataproc,谢谢,我会看看。 【参考方案1】:

您的问题的答案主要取决于您的用例和您将要处理的数据的大小,因此没有绝对正确的答案。

但是,关于 BigQuery 的使用,以及在您描述的场景中,您可能会对 BigQuery 的某些功能产生怎样的兴趣,您可能需要考虑一些要点。

让我快速回顾一下您应该看的主要主题:

定价:撇开存储费用不谈,并专注于查询本身的成本(这与您的用例更相关),BigQuery billing 基于每个查询处理的字节数。每月有 1TB 的免费配额,从那时起,每 TB 处理数据的成本为 5 美元,这是 10MB 数据的最小可衡量单位。 缓存:当 BigQuery 返回一些信息时,它会存储在 temporary cached table(如果您愿意,也可以是永久的),并且它们会被维护大约 24 小时,您可能会在此发现一些例外情况相同的文档链接(它们也是尽力而为,因此也可能会发生更早的删除)。从缓存表返回的结果不计费(因为根据计费的定义,成本基于处理的字节数,访问缓存表意味着没有进行任何处理),只要您是运行完全相同的查询。我认为这个特性值得一看,因为从你的句子“因为有多个脚本使用日常数据的子集”,也许(但只是在这里猜测)它适用于你的用例来执行单个查询一次,然后从缓存版本中多次检索结果,而无需将其存储在其他任何地方。 分区:BigQuery 提供了partitioned tables 的概念,这些表是按日期划分为更小的分段的单个表,这将使您可以更轻松地根据需要每天查询数据。 速度:BigQuery 提供了一个实时分析平台,因此您将能够执行快速查询以检索您需要的信息,并应用一些您以后可以在自定义 Python 算法中使用的初始处理。李>

因此,总的来说,我认为您无需将任何其他包含部分结果的数据库作为 BigQuery 存储的一部分。在资源和成本效率方面,BigQuery 提供了足够的功能让您在本地处理数据,而无需处理巨额费用或数据检索延迟。但是,这最终将取决于您的用例以及您存储和需要同时处理的数据量;但总的来说,我会单独使用 BigQuery。

【讨论】:

您好,感谢您的回复。我在帖子中忘记提到的一件事是我的 python 脚本会修改表的某些列。我计划在本地进行所有修改。因此,缓存的查询结果将无济于事。 那么,您是否需要将应用到表的修改存储回 BigQuery,还是只是为了使用 Python 算法进行数据分析而在本地完成的操作? 是的,我想最终将修改后的数据存储回 BigQuery。 如果您计划定期更新 BigQuery 数据库的内容,BigQuery 可能不是最适合您的产品。它主要是作为一个数据仓库系统,用于存储不应修改的静态数据,以便稍后在与分析相关的目的中检索它。但是,正如 this nice schema 所指出的,也许 BigTable 是更适合您的选择,但请记住,它的 Client Libraries 仍处于 alpha 阶段。 谢谢@dsesto,好的,我正在运行的脚本是预处理脚本(因此它们只需要运行一次)。我希望清理/修改后的数据可以查询,因此我们决定继续使用 BigQuery。

以上是关于使用 python 导出 BigQuery 数据进行分析的主要内容,如果未能解决你的问题,请参考以下文章

如何限制从 bigquery 导出到 gcs 的文件大小?

从 Google BigQuery 导出到 CloudSQL?

将多个 BigQuery 表导出为一个

Python GAE - 如何以编程方式将数据从备份导出到 Big Query?

将表从 google bigquery 导出到 google 存储

使用压缩的 AVRO 从 BigQuery 导出表