如何将 R 与 BigQuery 结合使用

您是否希望将驻留在 Google BigQuery 中的数据作为 R 工作流程的一部分进行分析?多亏了 bigrquery R 包,这是一种非常无缝的体验——一旦你知道在这些数据上运行 dplyr 函数需要一些小的调整。
不过,首先,您需要一个 Google Cloud 帐户。请注意,即使数据在其他人的帐户中并且您不打算存储自己的数据,您也需要自己的 Google Cloud 帐户。
许多人已经拥有用于 Google 云端硬盘或 Gmail 等服务的通用 Google 帐户。如果您还没有,请务必创建一个。
然后,前往 https://console.cloud.google.com 上的 Google Cloud Console,使用您的 Google 帐户登录,并创建一个新的云项目。 R 老手注意:虽然在 RStudio 中工作时项目是个好主意,但在 Google Cloud 中它们是强制性的。
单击新建项目选项以创建新项目。
您应该会在 Google Cloud 顶部导航栏的左侧看到创建新项目的选项。单击“Google Cloud Platform”右侧的下拉菜单(如果您还没有任何项目,它可能会显示“选择项目”)。给你的项目一个名字。如果您已经在您的 Google 帐户中启用了结算功能,您将需要选择一个结算帐户;如果你不这样做,那可能不会作为一个选项出现。然后点击“创建”。
如果您不喜欢分配给项目的默认项目 ID,可以在单击“创建”按钮之前对其进行编辑。
如果你不喜欢为你的项目自动生成的项目 ID,你可以编辑它,假设你没有选择已经采取的东西。
完成新项目设置后,您会看到一个通用的 Google Cloud 仪表板,它看起来有点让人不知所措。这些都是什么?BigQuery 在哪里?您可能不需要担心大多数其他服务,但您确实希望能够在所有这些服务中轻松找到 BigQuery。
如果您只想使用一项服务,初始的 Google Cloud 主屏幕可能会有点让人不知所措。 (我已经删除了这个项目。)
一种方法是将 BigQuery“固定”到左侧导航菜单的顶部。 (如果您没有看到左侧导航,请单击左上角的三行“汉堡包”将其打开。)一直向下滚动,找到 BigQuery,将鼠标悬停在它上面,直到您看到一个图钉图标,然后单击图钉。
向下滚动到 Google Cloud 主屏幕左侧导航的底部,找到 BigQuery 服务。您可以通过将鼠标悬停在上面来“固定”它,直到看到固定图标,然后单击它。
现在,BigQuery 将始终显示在您的 Google Cloud Console 左侧导航菜单的顶部。向上滚动,您会看到 BigQuery。单击它,您将进入带有项目名称的 BigQuery 控制台,其中没有任何数据。
如果“编辑器”选项卡没有立即可见,请单击右上角的“编写新查询”按钮。
怎么办?人们通常通过使用可用的公共数据集来开始学习 BigQuery。您可以将其他用户的公共数据项目固定到您自己的项目中,包括一套由 Google 收集的数据集。如果您在您一直使用的同一个 BigQuery 浏览器选项卡中转到此 URL,Google 公共数据项目应该会自动将自己固定到您的项目。
感谢 GitHub 上的 JohannesNE 提供此提示:您可以使用下面显示的 URL 结构固定您可以访问的任何数据集。
如果这不起作用,请检查以确保您使用的是正确的 Google 帐户。如果您在浏览器中登录了多个 Google 帐户,您可能会被发送到与预期不同的帐户。
固定项目后,单击该固定项目名称左侧的三角形(在本例中为 bigquery-public-data),您将看到该项目中可用的所有数据集。 BigQuery 数据集就像一个传统的数据库:它有一个或多个数据表。单击数据集旁边的三角形以查看它包含的表格。
单击 BigQuery 网络界面中的表,您可以查看其架构,以及用于预览数据的选项卡。
单击表名以查看其架构。还有一个“预览”选项卡,可让您查看一些实际数据。
还有其他更少点击式的方法来查看您的数据结构。但首先….
BigQuery 对数据存储和数据查询都收费。当使用其他人创建的数据集时,他们需要为存储付费。如果您在 BigQuery 中创建和存储自己的数据,则需要付费——无论您是唯一一个使用它的人、与其他几个人共享数据还是将其公开,费率都是一样的。 (您每月可获得 10 GB 的免费存储空间。)
请注意,如果您对其他人的数据进行分析并将结果存储在 BigQuery 中,则新表将成为您的存储分配的一部分。
查询的价格基于查询处理的数据量而不是返回的数据量。这个很重要。如果您的查询在分析 4 GB 数据集后仅返回前 10 个结果,则该查询仍将使用您的 4 GB 数据分析配额,而不仅仅是与您的 10 行结果相关的少量数据。
您每月免费获得 1 TB 的数据查询;为分析而处理的每额外 TB 数据的成本为 5 美元。
如果你直接在数据上运行 SQL 查询,谷歌建议永远不要运行 SELECT * 命令,它会遍历所有可用的列。相反,只选择您需要减少需要处理的数据的特定列。这不仅可以降低您的成本;它还使您的查询运行得更快。我对我的 R dplyr 查询做同样的事情,并确保只选择我需要的列。
如果您想知道如何在查询运行之前知道您的查询将使用多少数据,答案很简单。在 BigQuery 云编辑器中,您可以在不运行查询的情况下键入查询,然后查看它将处理多少数据,如下面的屏幕截图所示。
使用 Web 界面中的 BigQuery SQL 编辑器,您可以在其数据集和项目下找到您的表。在不运行查询的情况下键入查询会显示它将处理多少数据。请记住在查询中使用 `projectname.datasetname.tablename`
即使您不了解 SQL,您也可以通过简单的 SQL 列选择来了解 R 中的成本,因为任何额外的过滤或聚合都不会减少分析的数据量。
因此,如果您的查询运行在 table-id 中名为 columnA、columnB 和 columnC 的三个列上,并且 table-id 在 dataset-id 中,它是 project-id 的一部分,您只需在查询编辑器中键入以下内容:
不要运行查询,只需键入它,然后查看右上角的行以查看将使用多少数据。无论您的 R 代码将对该数据做什么,都不会影响查询成本。
在上面的屏幕截图中,您可以看到我从 schedules 表中选择了三列,这是棒球数据集的一部分,是 bigquery-public-data 项目的一部分。
对元数据的查询是免费的,但您需要确保正确构建查询以符合查询条件。例如,使用 SELECT COUNT(*) 获取数据集中的行数是不收费的。
您还可以采取其他措施来限制成本。有关更多提示,请参阅 Google 的“控制 BigQuery 中的成本”页面。
不,您不需要信用卡即可开始使用 BigQuery。但是如果不启用计费,您的帐户就是一个 BigQuery“沙盒”,并非所有查询都有效。我强烈建议向您的帐户添加计费来源,即使您极不可能超出免费 BigQuery 分析的配额。
现在——终于! — 让我们看看如何使用 R 进入 BigQuery。
我将在本教程中使用 bigrquery 包,但您可能还需要考虑其他选项,包括 obdc 包或 RStudio 的专业驱动程序及其企业产品之一。
要使用 R 和 bigrquery 查询 BigQuery 数据,您首先需要使用以下语法建立与数据集的连接:
第一个参数是 bigrquery 包中的 bigquery() 函数,它告诉 dbConnect 您想要连接到 BigQuery 数据源。其他参数概述了项目 ID、数据集名称和计费项目 ID。
(连接对象几乎可以被称为任何东西,但按照惯例,它们通常被命名为 con。)
下面的代码加载 bigrquery 和 dplyr 库,然后创建与棒球数据集中的时间表表的连接。
bigquery-public-data 是项目参数,因为那是数据集所在的地方。 my_project_id 是计费参数,因为我的项目的配额将针对查询“计费”。
当我运行这段代码时,除了创建一个连接变量外,什么也没发生。但我第一次尝试使用该连接时,系统会要求我在浏览器窗口中验证我的 Google 帐户。
例如,要列出棒球数据集中所有可用的表,我会运行以下代码:
要在 R 中查询一个特定的 BigQuery 表,请使用 dplyr 的 tbl() 函数创建一个引用该表的表对象,例如使用我新创建的棒球数据集连接的时间表表:
如果您使用基本 R str() 命令检查 sked 的结构,您将看到一个列表,而不是数据框:
幸运的是,像 glimpse() 这样的 dplyr 函数通常可以与这种类型的对象(类 tbl_BigQueryConnection)无缝地工作。
运行 glimpse(skeds) 将主要返回您所期望的——除了它不知道数据中有多少行。
这告诉我 glimpse() 可能不会解析整个数据集——这意味着它很有可能不会增加查询费用,而是查询元数据。当我在运行该命令后检查我的 BigQuery Web 界面时,确实没有查询费用。
您可以对表对象运行 dplyr 命令,其方式与对传统数据框的操作方式几乎相同。但您可能还需要一个补充:将通常的 dplyr 工作流程的结果通过管道传输到 collect() 函数中。
下面的代码使用 dplyr 查看 skeds 表对象中的年份和主队,并将结果保存到 tibble(tidyverse 软件包套件使用的特殊类型的数据框)。
定价说明:我使用寻求相同信息的 SQL 语句检查了上述查询:
当我这样做时,BigQuery Web 编辑器显示只处理了 21.1 KiB 的数据,不超过 10 MB。为什么我的账单多了这么多?查询最小为 10 MB(并四舍五入到下一个 MB)。
旁白:如果您想将 R 查询的结果存储在临时 BigQuery 表而不是本地数据框中,您可以将 compute(name = “my_temp_table”) 添加到管道的末尾而不是 collect()。然而,你需要在一个你有权创建表的项目中工作,而谷歌的公共数据项目绝对不是那个。
如果您在没有 collect() 的情况下运行相同的代码,例如
您正在保存查询而不是查询的结果。请注意,available_teams 现在是一个具有类 tbl_sql、tbl_BigQueryConnection、tbl_dbi 和 tbl_lazy 的查询对象(惰性意味着它不会运行,除非特别调用)。
您可以在脚本中单独使用对象名称来运行保存的查询:
您可以在链式管道的末尾使用 show_query() 看到由 dplyr 语句生成的 SQL:
您可以将此 SQL 剪切并粘贴到 BigQuery 网络界面中,以查看您将使用多少数据。只需记住将普通表名(如“schedules”)更改为语法“project.dataset.tablename”;在这种情况下,`bigquery-public-data.baseball.schedules`。
如果您在 R 会话中第二次运行完全相同的查询,您将不会再次为数据分析付费,因为 BigQuery 将使用缓存的结果。
如果您习惯于编写 SQL 查询,并且想从 BigQuery 中提取数据作为更大的 R 工作流的一部分,则还可以在 R 中运行 SQL 命令。
例如,假设您要运行此 SQL 命令:
您可以使用 DBI 包的 dbGetQuery() 函数在 R 中执行此操作。这是代码:
请注意,我再次为该查询付费,因为 BigQuery 不认为 R 中的一个查询和 SQL 中的另一个查询完全相同,即使它们正在寻找相同的数据。
如果我再次运行该 SQL 查询,我就不会被收费。
在一次性初始设置之后,在 R 中分析 BigQuery 数据就像在本地数据帧上运行 dplyr 代码一样容易。请记住您的查询成本。如果您在 10 GB 的数据集上运行十几个查询,您将不会接近达到 1 TB 的每月免费配额。但是,如果您每天都在处理更大的数据集,那么有必要研究一下简化代码的方法。

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627