大查询删除嵌套在 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 类型列中查询特定的内容

Pyspark Struct 列:爆炸后的奇怪行为

Spark基于其他数据框中的列对数据框中的列进行重复数据删除

BigQuery 将新列添加到子查询中的嵌套 STRUCT

从不在列表中的每行数据框中的列中删除字符串