BigQuery 最佳 ETL 方法(外部表和视图与数据流)

Posted

技术标签:

【中文标题】BigQuery 最佳 ETL 方法(外部表和视图与数据流)【英文标题】:BigQuery best approach for ETL (external tables and views vs Dataflow) 【发布时间】:2017-04-26 00:48:21 【问题描述】:

CSV 文件每天都会上传到某个 FTP 服务器(我没有 SSH 访问权限),我需要生成每周数据,将这些文件与转换合并。该数据将进入 BQ 中的历史表和 GCS 中的 CSV 文件。

我的做法如下:

创建一个 Linux VM 并设置一个 cron 作业来同步来自 带有 GCS 存储桶的 FTP 服务器(我正在使用 GCSFS) 在 BQ 中为每个类别的 CSV 文件使用外部表 创建具有复杂查询的视图以转换数据 每周使用另一个 cron 作业创建一个包含历史数据和 CSV 文件的表。

我的想法是尽可能多地删除中间过程,并尽可能简化实现,包括 ETL 的数据流,但我首先有一些问题: 我的方法在效率和金钱方面有什么问题? 有什么 DataFlow 可以提供我的方法不能提供的吗? 关于其他方法的任何想法?

顺便说一句,我遇到了一个可以通过自己解析 csv 文件而不是使用外部表来解决的问题,外部表是无效字符,如空字符,所以我可以摆脱它们,而作为外部表存在是解析错误。

【问题讨论】:

【参考方案1】:

Google DataFlow Pipeline 批处理执行作业可能会简化您的 ETL。将您的文件上传到 GCS 存储桶。对于转换使用管道转换来去除空值和无效字符(或任何您需要的)。在这些转换后的数据集上使用您的复杂查询,例如按键分组、聚合(求和或合并),如果您需要边输入,数据流也提供将其他数据集合并到当前数据集的能力。最后,转换后的输出可以写入 BQ,或者您可以编写自己的自定义实现来写入这些结果。

因此,数据流为您的解决方案提供了非常高的灵活性,您可以分支管道并在具有相同数据集的每个分支上以不同方式工作。关于成本,如果您使用三个工人运行批处理作业,这是默认的,成本应该不会很高,但是如果您只想专注于您的业务逻辑而不担心其余部分,谷歌数据流是非常有趣,如果使用得当,它会非常强大。

数据流可帮助您将所有内容集中在一个盘子上并有效地管理它们。查看其定价并确定它是否最适合您(您的问题完全可以通过谷歌数据流解决),您的方法还不错,但需要对这些部分进行额外维护。 希望这会有所帮助。

【讨论】:

【参考方案2】:

这里有一些想法。

如果您使用的数据量非常少,那么您的方法可能会很好用。如果您正在处理更多数据并需要多个 VM,Dataflow 可以自动增加和减少您的管道使用的工作人员数量,以帮助其更高效地运行并节省成本。

另外,您的 linux 虚拟机是否一直在运行?还是仅在您运行 cron 作业时才启动?批处理 Dataflow 作业仅在需要时运行,这也有助于节省成本。

在 Dataflow 中,您可以使用 TextIO 读取文件的每一行,并添加您的自定义解析逻辑。

您提到您有一个将文件放入 GCS 的 cron 作业。数据流可以从 GCS 读取,因此保留该过程并从 GCS 读取数据流作业可能是最简单的。否则,您将需要编写一个自定义源以从您的 FTP 服务器读取。

以下是一些有用的链接: https://cloud.google.com/dataflow/service/dataflow-service-desc#autoscaling

【讨论】:

在这种情况下,什么是不是非常低的数据量? 我喜欢联合资源,因为它太简单了选择。现在有了数据流,我正在考虑为每个文件模式创建一个管道(我只需提供模式和模式作为参数)。然后我想我可以使用视图来删除重复项

以上是关于BigQuery 最佳 ETL 方法(外部表和视图与数据流)的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 视图可以引用来自不同数据集/项目的其他表和视图吗?

从外部表读取与加载数据并在 Bigquery 中读取

Google BigQuery 上的最佳 JOIN 性能

Google Bigquery 外部加入 UNNEST

从 PostgreSQL 到数据仓库:近实时 ETL / 数据提取的最佳方法

Google Cloud Dataflow ETL(数据存储区 -> 转换 -> BigQuery)