大查询删除嵌套在 STRUCT 对象中的列
Posted
技术标签:
【中文标题】大查询删除嵌套在 STRUCT 对象中的列【英文标题】:Big query remove column nested in STRUCT object 【发布时间】:2021-01-07 16:12:34 【问题描述】:我在从我的 bigquery 表中删除一列时遇到了一些麻烦。
我有一个名为 jsonPayload
的 STRUCT 对象。
该字段有多个子字段。
例如:
jsonPayload.source
jsonPayload.status
jsonPayload.markers.message_timestamp
jsonPayload.markers.id
我想删除列jsonPayload.markers.message_timestamp
,它是一个字符串,而不删除任何其他字段。
这个线程BigQuery select expect double nested column的情况完全一样,但是当我执行这个时,它会删除所有的jsonPayload。*就像jsonPayload.source
一样
我找不到执行此操作的正确语法。有人可以帮助我吗?
编辑:
这是我的 bigquery 表的数据结构:
Field name | Type | Mode |
---|---|---|
jsonPayload |
RECORD | NULLABLE |
jsonPayload.source |
STRING | NULLABLE |
jsonPayload.msg |
STRING | NULLABLE |
jsonPayload.level |
STRING | NULLABLE |
jsonPayload.err |
STRING | NULLABLE |
jsonPayload.timestamp |
STRING | NULLABLE |
jsonPayload.markers.message_partition |
FLOAT | NULLABLE |
jsonPayload.markers.message_topic |
STRING | NULLABLE |
jsonPayload.markers.message_offset |
FLOAT | NULLABLE |
jsonPayload.markers.message_timestamp |
STRING | NULLABLE |
只想删除最后一列 (jsonPayload.markers.message_timestamp
) 并保留所有其他列。
我试过这个,但它似乎也删除了所有不是标记的字段(jsonPayload.source
,...):
SELECT * REPLACE(
(SELECT AS STRUCT(SELECT AS STRUCT jsonPayload.markers.* EXCEPT (message_timestamp)))
AS jsonPayload)
FROM mytable.dataset
谢谢
【问题讨论】:
不清楚 - 是 STRUCT 还是 JSON - 提供数据示例和预期输出以便我们提供帮助 谢谢米哈伊尔。我添加了数据结构的摘录,以更好地解释我面临的问题。 【参考方案1】:以下是 BigQuery 标准 SQL
select * replace(
(select as struct jsonPayload.* replace(
(select as struct jsonPayload.markers.* except(message_timestamp))
as markers
)
) AS jsonPayload)
from `project.dataset.table`
【讨论】:
以上是关于大查询删除嵌套在 STRUCT 对象中的列的主要内容,如果未能解决你的问题,请参考以下文章
使用嵌套行(类型 STRUCT)对表 SQL 进行重复数据删除
如何从 Bigquery 中的这个嵌套 JSON 类型列中查询特定的内容