在 Dataflow 中使用啥转换来合并具有不同列的 csv 文件,同时将它们加载到 BigQuery?

Posted

技术标签:

【中文标题】在 Dataflow 中使用啥转换来合并具有不同列的 csv 文件,同时将它们加载到 BigQuery?【英文标题】:What transformation to use in Dataflow to merge csv files with differing columns while loading them to BigQuery?在 Dataflow 中使用什么转换来合并具有不同列的 csv 文件,同时将它们加载到 BigQuery? 【发布时间】:2020-03-10 11:04:45 【问题描述】:

我有几个 csv 文件,我需要为这些文件创建一个表。问题是文件有不同的列 - 大多数列是相同的,除了 1 或最多 2 列发生变化。使用图形用户界面将它们从 GCS 加载到 BigQuery 会产生不正确的结果或完全失败。此外,每当缺少 YEAR 列时,我想为整个文件手动提供一个值。 我们可以看下面2个文件做demo——

file1.csv -

ITEM,TYPE,COLOR,YEAR
a,1,red,2010
b,2,blue,2010
c,3,green,2010

file1.csv 其中YEAR 将是 2012(缺失列的位置不必在末尾)-

ITEM,TYPE,COLOR
d,3,yellow
e,2,orange
f,1,cyan

将文件合并到单个 BigQuery 表中的样子 -

+------+------+--------+------+
| ITEM | TYPE | COLOR  | YEAR |
+------+------+--------+------+
| a    |    1 | red    | 2010 |
| b    |    2 | blue   | 2010 |
| c    |    3 | green  | 2010 |
| d    |    3 | yellow | 2012 |
| e    |    2 | orange | 2012 |
| f    |    1 | cyan   | 2012 |
+------+------+--------+------+

我想知道在从 GCS 读取文件并将它们作为表加载到 BigQuery 中时是否可以进行此类转换(最好使用 Apache Beam 的 Python SDK?)。

使用 SDK 还是提供自定义模板文件从 GCS 运行更好(如 Dataflow GUI 所示)?

任何关于它的资源将不胜感激。

【问题讨论】:

【参考方案1】:

请查看this,您可以在其中找到使用 Dataflow python API 从 CSV 文件提取数据并将其写入 BigQuery 的指南。

这是另一个guide,它还从 CSV 文件中提取数据,并通过将源数据中的日期格式转换为 BigQuery 接受的日期格式来执行基本的数据类型转换。

关于您的问题“使用 SDK 还是提供从 GCS 运行的自定义模板文件更好(如 Dataflow GUI 所示)? 我相信这是个人喜好问题,没有一个比另一个更好。

话虽如此,请随时关注此tutorial,其中包含多个 Google 提供的批处理模板。

【讨论】:

以上是关于在 Dataflow 中使用啥转换来合并具有不同列的 csv 文件,同时将它们加载到 BigQuery?的主要内容,如果未能解决你的问题,请参考以下文章

在R中合并具有重复的配对列

合并具有不同列数的表

我们如何在 Spark 中使用 Dataframes(由 structtype 方法创建)合并具有不同列数的 2 个表?

使用具有相同字符串但顺序不同的列合并两个 data.frame

合并具有不同列名但定义相同的多个CSV

如何合并 SQL Server 中具有映射到通用描述的不同列标题的表?