将数据集参数添加到列中,以便稍后通过 DataPrep 在 BigQuery 中使用它们

Posted

技术标签:

【中文标题】将数据集参数添加到列中,以便稍后通过 DataPrep 在 BigQuery 中使用它们【英文标题】:Add dataset parameters into column to use them in BigQuery later with DataPrep 【发布时间】:2019-02-19 12:55:55 【问题描述】:

我正在通过 Google DataPrep 从 Google Cloud Storage (GCS) 导入几个文件,并将结果存储在 Google BigQuery 的表中。 GCS 上的结构如下所示:

//source/user/me/datasets/month/2017-01-31-file.csv
//source/user/me/datasets/month/2017-02-28-file.csv
//source/user/me/datasets/month/2017-03-31-file.csv

我们可以创建一个参数为outlined on this page的数据集。这一切都很好,我已经能够正确导入它。

但是,在这个 BigQuery 表(输出)中,我无法仅提取带有参数 month 的行。

因此,我如何使用 DataPrep 将这些数据集参数(此处为:month)添加到我的 BigQuery 表中?

【问题讨论】:

您应该尝试在 Trifacta 论坛上提出这个问题(这是在 Google Dataprep 命名下运行的实际解决方案):community.trifacta.com/s/topic/0TO16000000g8CSGAY/… 谢谢,但我讨厌拥有两千个不同的帐户。 问题是您在生成的数据集中缺少文件名? 文件夹和另一个动态子文件夹的文件名和日期。我按数据类型和日期(yyyymmdd)存储文件。我希望这反映在表格中,因为我正在使用附加到表格,这样我就可以有效地过滤掉每日文件 【参考方案1】:

虽然最初的答案在发布时是正确的,但上周推出了一项更新,其中添加了一些未在发行说明中特别提及的功能,包括针对此问题的另一种解决方案。

除了SOURCEROWNUMBER()(现在也可以表示为$sourcerownumber)之外,现在还有一个名为$filepath 的源元数据引用——正如您所料,它将文件的本地路径存储在云中存储。

这里有许多注意事项,例如它不会返回 BigQuery 源的值,并且在您 pivotjoinunnest 时不可用。 . .但在您的场景中,您可以轻松地将其放入列中并使用它进行任何需要的匹配或删除。

注意:如果您的数据源示例是在此功能之前创建的,您需要创建一个新示例才能在界面中看到它(而不仅仅是 NULL 值)。

这些元数据字段的完整注释可在此处获得: https://cloud.google.com/dataprep/docs/html/Source-Metadata-References_136155148

【讨论】:

【参考方案2】:

目前无法访问流中的数据源位置或参数匹配值。只有数据集中的数据可供您使用。 (SOURCEROWNUMBER()除外)

部分解决方案

我一直用来模拟将参数插入最终表的一种方法是通过参数导入多个数据集,然后在将转换运行到最终表之前将它们合并。

对于每个已知的参数搜索数据集,有一个配方,用每个数据集的该参数填充一列,然后合并每个数据集的结果。

显然,这只有如此可扩展,即,如果您知道将匹配的参数值集,它就可以工作。一旦你得到源文件中时间戳的粒度,这是不可能的。

在这个例子中,只有年份值是过滤参数。


更长的解决方案 (旁白)

我最终选择的替代方法是使用 Dataprep 定义数据流作业,将它们用作数据流模板,然后运行一个编排函数来运行数据流作业(不是 dataprep)并通过 API 修改输入和输出的参数.然后是一个转换 BigQuery 作业,它执行了综合附加功能。

如果流程非常稳定,则值得这样做,但不适用于临时;一切都取决于你的规模。

【讨论】:

实际上,@Trifacta 在社区论坛中的回答看起来更符合要求。 $filename 作为参考。随着时间的推移,也许会添加其他参考资料。在这种情况下,最有用的是包含每个输入数据集的匹配值。即 $parameters > ['2019', '2019-02-22', 'csv'] $parameters[0] = '2019' 正如我在回答中指出的那样,这现在通过 Cloud Dataprep 中的$filepath 浮出水面。可能值得用此信息更新您接受的答案,因为这是一个更简单的选择!

以上是关于将数据集参数添加到列中,以便稍后通过 DataPrep 在 BigQuery 中使用它们的主要内容,如果未能解决你的问题,请参考以下文章

如何将Python Dask Dataframes合并到列中?

Laravel:添加到列中的现有字段数据

通过检测 NaN 出现的位置,通过其他列的数学运算将 NaN 填充到列中

将双引号添加到列中的值,只要值在数据框中有引号

Power Query:当特定值出现在另一列中时如何将一个添加到列中

将两个行值放入一列,将另一行值放入另一列,可以将更多行值添加到列中