Dataflow SQL (GCP) 不支持使用 STRUCT 的嵌套行

Posted

技术标签:

【中文标题】Dataflow SQL (GCP) 不支持使用 STRUCT 的嵌套行【英文标题】:Nested rows using STRUCT are not supported in Dataflow SQL (GCP) 【发布时间】:2021-07-29 13:36:17 【问题描述】:

使用 Dataflow SQL,我想读取 Pub/Sub 主题、丰富消息并将消息写入 Pub/Sub 主题。

哪个 Dataflow SQL 查询将创建我想要的输出消息?

Pub/Sub 输入消息:"event_timestamp":1619784049000, "device":"ID":"some_id"

所需的 Pub/Sub 输出消息:"event_timestamp":1619784049000, "device":"ID":"some_id", "NAME":"some_name"

我得到的是:"event_timestamp":1619784049000, "device":"ID":"some_id", "NAME":"some_name"

但我需要在“设备”属性中的名称

SELECT message_table.device as device, devices.name as NAME 
FROM pubsub.topic.project_id.`topic` as message_table
  JOIN bigquery.table.project_id.dataflow_sql_dataset.devices as devices 
  ON devices.device_id = message_table.device.id

【问题讨论】:

您可以将 BQ 表与您的 Dataflow SQL 管道连接起来吗?实际上就像一个简单的查询。 是的,我可以。喜欢:选择 message_table.device 作为设备,“some_name”作为 NAME FROM pubsub.topic.project_id.topic 作为 message_table 加入 bigquery.table.project_id.dataflow_sql_dataset.devices 作为设备 ON devices.device_id = message_table.device.id跨度> 而且,这是您想要实现的目标吗?否则,我不明白yoru阻塞点 我得到了什么:"event_timestamp":1619784049000, "device":"ID":"some_id", "NAME":"some_name" 想要什么:"event_timestamp":1619784049000, "device":"ID":"some_id", "NAME":"some_name" 。 【参考方案1】:

很遗憾,Dataflow SQL 目前不支持 STRUCT/Sub 查询,但我们正在努力解决这个问题。由于有一些 Apache Beam 依赖项阻碍了它的进展(Nested Rows Support、Upgrading Calcite),我们目前无法提供 ETA,但您可以在 issue tracker 上关注它的进展。

【讨论】:

【参考方案2】:

你需要在投影中创建一个结构体(SELECT部分​​)

SELECT STRUCT(message_table.device.ID as ID , devices.name as NAME) as device
FROM pubsub.topic.project_id.`topic` as message_table
  JOIN bigquery.table.project_id.dataflow_sql_dataset.devices as devices 
  ON devices.device_id = message_table.device.id

【讨论】:

谢谢你,纪尧姆。我试过了,但在创建数据流作业期间它给出了一个错误:“exec.go:64”,“消息”:“SQL 作业启动的参数无效/不受支持:查询使用不支持的 SQL 功能:不支持 expr 节点类型 RESOLVED_MAKE_STRUCT " 我的错,我确信它会工作,因为它在 SQL 中工作......也许有一天我的答案会有效!但不是今天。我担心这种情况没有解决方案...... 感谢您的帮助,不胜感激!

以上是关于Dataflow SQL (GCP) 不支持使用 STRUCT 的嵌套行的主要内容,如果未能解决你的问题,请参考以下文章

在 GCP Dataflow 上的 python apache 光束中使用 scipy

GCP Dataflow + Apache Beam - 缓存问题

Dataflow API 不会在 GCP 中激活

请求的身份验证范围不足 - GCP 上的 Dataflow/Apache Beam

使用 GCP Cloud DataFlow 读取 BigTable 并转换为通用记录

JAVA - Apache BEAM- GCP:GroupByKey 与 Direct Runner 一起工作正常,但与 Dataflow runner 一起失败