BigQuery:从多个嵌套列中选择 * 替换

Posted

技术标签:

【中文标题】BigQuery:从多个嵌套列中选择 * 替换【英文标题】:BigQuery: select * replace from multiple nested column 【发布时间】:2018-03-19 15:16:34 【问题描述】:

我正在尝试删除嵌套在多个记录中的字段。在this 问题之后,我尝试了以下操作(删除具有路径 a.b.d 的列 d)但出现错误:Unrecognized name: b at [6:68]

WITH T AS (
  SELECT * from unnest([struct(struct(struct(10 as c,'test' as d) as b,'field2' as field2) as a)])

)

select * replace ((select as struct a.* replace( (select as struct b.* except (d)) as b)) as a)  from T;

【问题讨论】:

【参考方案1】:

根据我对您的问题的理解-您的原始行如下

STRUCT(STRUCT(STRUCT(10 AS c,'test' AS d) AS b,'field2' AS field2) AS a) original_struct  

你需要得到它

STRUCT(STRUCT(STRUCT(10 AS c) AS b,'field2' AS field2) AS a) original_struct 

下面是 BigQuery 标准 SQL 来完成的

#standardSQL
WITH t AS (
  SELECT STRUCT(STRUCT(STRUCT(10 AS c,'test' AS d) AS b,'field2' AS field2) AS a) original_struct 
) 
SELECT 
  original_struct,
  (
    SELECT AS STRUCT (
      SELECT AS STRUCT (
        SELECT AS STRUCT * EXCEPT(d) 
        FROM UNNEST([original_struct.a.b]) b
      ) b, 
      original_struct.a.field2
    ) a
  ) new_struct
FROM t

原始结构看起来像

Row original_struct.a.b.c   original_struct.a.b.d   original_struct.a.field2    
1   10                      test                    field2   

而新结构是

Row new_struct.a.b.c    new_struct.a.field2  
1   10                  field2   

因此,要进一步将其应用于您的特定情况 - 请参见下面的示例

#standardSQL
WITH t AS (
  SELECT 1 id, 2 x, 3 y, STRUCT(STRUCT(STRUCT(10 AS c,'test' AS d) AS b,'field2' AS field2) AS a) xyz, 4 v, 5 w 
) 
SELECT * REPLACE (
  (
    SELECT AS STRUCT (
      SELECT AS STRUCT (
        SELECT AS STRUCT * EXCEPT(d) 
        FROM UNNEST([xyz.a.b]) b
      ) b, 
      xyz.a.field2
    ) a
  ) AS xyz)
FROM t

【讨论】:

有没有办法在我的原始查询中使用替换 *?我使用的原始架构很大,我不想通过查询来重建它,而是使用 *(并替换)。 您是否在我的答案底部看到了示例?它正是这样做的!您无需在此处列出架构中的所有字段 - 但您需要反映您的嵌套结构! 您提到了字段 xyz.a.field2 的名称。如果有数百个这样的字段(xyz.a.field1 到 xyz.a.field100)会发生什么?使用 * 会让事情变得更容易。 :o) 我回答了具体问题!我认为这是处理该特定问题的最佳方式!如果您有新问题,其中有数百个这样的字段,出于某种原因您需要核对 - 只需发布新问题,有人可能会回答:o)我也会尝试 - 如果您发布新问题。但是这个 - 我认为已经回答(我的意思是我的意思 - 即使你期待别的东西)

以上是关于BigQuery:从多个嵌套列中选择 * 替换的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 正则表达式从字符串中删除/替换文本列表

从 BigQuery 中的重复嵌套列中获取参数数组

如何从 Bigquery 中的这个嵌套 JSON 类型列中查询特定的内容

根据另一列中的值更新 BigQuery 中的嵌套数组

使用 Flatten 从包含多个嵌套变量的 bigquery 表中选择 where var1 (non-repeated) = "abc"?

在 Power BI 中使用 BigQuery 重复/嵌套字段