繁体   English   中英

如何在 Apache Beam Java 中写入带有动态标头的 CSV 文件

[英]How do I write CSV file with dynamic headers in Apache Beam Java

我是 Apache Beam 的新手,我正在从事一项将在 GCP Dataflow 中运行的工作。 我需要从 BigQuery 中获取一些数据,对其进行转换并编写一个带有标题的 CSV 文件作为结果。 但我发现自己处于一个有趣的场景中。 看,我的 CSV 文件的标题是动态的,它们取决于从 BigQuery 获取的数据。 因此,当我构建管道并尝试定义标头时,我发现了一个问题,我还没有标头:

somePCollection.apply("writing stuff", TextIO.write()
                        .to("gs://some_bucket/somefile_name")
                        .withSuffix(".csv").withHeader(I CAN'T SET THE HEADERS HERE BECAUSE I DON'T HAVE THEM));

你可能想知道数据是什么样子的? 此时我的 Pcollection 结构如下所示:

user_id, fst_name, lst_name, team_list

PCOllection 示例:

1111,DANNY,CRUISE, TEAM34,TEAM12,TEAM4
2222,CARLOS,SMITH, TEAM34,TEAM44,TEAM12
33333,SASHA,CONOR, TEAM5,TEAM34,TEAM44

带有标头的预期 CSV 文件如下所示:

USER_ID,FST_NAME,LST_NAME,TEAM34,TEAM12,TEAM4,TEAM44,TEAM5
1111,    DANNY,   CRUISE,   1,    1,     1,   0,    0
2222,    CARLOS,  ,SMITH,  1,    1,     0,   1,    0
33333,    SASHA,  ,CONOR,  1,    0,     0,   1,    1

如您所见,在标题中,我需要将所有独特的团队作为列(显然,这些列在执行之间可能会有所不同)并且每行将有 1 或 0,具体取决于用户是否在该团队中。

看起来标题只能在管道构建时定义。

我一直试图找到一种方法来“欺骗”apache 光束并在单个管道中完成此操作,但我开始认为唯一的方法是通过执行单独的作业/管道来“计算”标题并将它们写在某个地方,这样我就可以将它们用作其他管道中的输入。

我拒绝认为我是第一个不得不处理这种情况的人,所以我想知道是否有人有解决这个问题的想法。

使用普通的 Java 执行此操作非常简单……但使用 Apache Beam 则另当别论。 我感谢任何帮助。

我不认为这可以用今天的 TextIO 来完成。 听起来您需要进行一些处理才能获取所有可能的团队,而不是每个记录,因此使用 FileIO 进行更多自定义并不容易。

单独的管道应该可以正常工作,但您将读取所有数据两次。

我还不太熟悉 Python SDK /Beam DataFrames ,但是您尝试做的事情(单热编码)听起来对 pandas 来说是合理的,如果允许切换到 Python,甚至在ML 的数据管道中提到过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM