PCollection<Entity> 到 PCollection<TableRows>

Posted

技术标签:

【中文标题】PCollection<Entity> 到 PCollection<TableRows>【英文标题】:PCollection<Entity> to PCollection<TableRows> 【发布时间】:2017-06-23 09:27:13 【问题描述】:

我正在尝试使用 Dataflow 在 Datastore 中查询我的所有类型,并将它们写入 BigQuery 中的日期分段分区。阅读部分很容易使用DatastoreIO.read() 并给我一个PCollection&lt;Entity&gt;

BigQuery 需要 PCollection&lt;TableRow&gt;,我可以隐式地从一个转换为另一个吗?我的数据涉及一些不可预测的字段(例如嵌入属性中的包数据),因此我无法显式转换所有字段。

另外,如果与此事相关,我想使用SerializableFunction 为每个数据存储实体动态设置目标表(即 YYYYMMDD_kind)

【问题讨论】:

【参考方案1】:

您必须自己将PCollection&lt;Entity&gt; 转换为PCollection&lt;TableRow&gt;BigQueryIO.write() 的 API 需要 TableRow。要转换它们,您需要在 PCollection&lt;Entity&gt; 的顶部应用 ParDo

附带说明,您还可以不使用 Dataflow 将 Datastore 备份直接加载到 BigQuery。见here。

【讨论】:

ParDo 可以自动检测列类型吗? 什么意思?您需要指定I(输入)和O(输出)的类型-在您的情况下分别为EntityTableRow 我的意思是我必须手动分配每个属性吗?例如 row.id = entity.id 是的,据我所知这是唯一的方法。

以上是关于PCollection<Entity> 到 PCollection<TableRows>的主要内容,如果未能解决你的问题,请参考以下文章

如何从光束中的 PCollection<string> 获取所有文件元数据

是否可以从 PubSub 读取消息并将其数据分隔在 PCollection<String> 的不同元素中?如果是这样,怎么做?

如何从谷歌数据流管道中的多个输入 PCollection 生成一个输出 PCollection?

如何从 Dataflow 中的 PCollection 读取 bigQuery

多个表的Pcollection

从 PCollections 获取列表