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 视图可以引用来自不同数据集/项目的其他表和视图吗?