繁体   English   中英

转换ARRAY <STRUCT> 到BigQuery SQL中的多个列

[英]Convert ARRAY<STRUCT> to multiple columns in BigQuery SQL

我正在尝试将Array <struct>转换为多列。 数据结构如下:

column name: Parameter
[
  -{
      key: "Publisher_name"
      value: "Rubicon"
   }
  -{
      key: "device_type"
      value: "IDFA"
   }
  -{
      key: "device_id"
      value: "AAAA-BBBB-CCCC-DDDD"
   }
] 

我想得到什么:

publisher_name  device_type  device_id
Rubicon         IDFA         AAAA-BBBB-CCCC-DDDD

我已经试过了,这导致了其他列的重复。

select h from table unnest(parameter) as h

顺便说一句,我很好奇为什么我们要在Bigquery中使用这种结构。 我们不能仅将上述3列添加到表中吗?

要转换为多列,您需要进行汇总,如下所示:

select ?,
       max(case when pv.parameter = 'Publisher_name' then value end) as Publisher_name,
       max(case when pv.parameter = 'device_type' then value end) as device_type,
       max(case when pv.parameter = 'device_id' then value end) as device_id
from t cross join
     unnest(parameter) pv
group by ?

您需要明确列出所需的新列。 ? 用于保持不变的列。

以下是BigQuery标准SQL

#standardSQL
SELECT 
  (SELECT value FROM UNNEST(Parameter) WHERE key = 'Publisher_name') AS Publisher_name,
  (SELECT value FROM UNNEST(Parameter) WHERE key = 'device_type') AS device_type,
  (SELECT value FROM UNNEST(Parameter) WHERE key = 'device_id') AS device_id
FROM `project.dataset.table`

您可以使用SQL UDF进一步重构代码,如下所示

#standardSQL
CREATE TEMP FUNCTION getValue(k STRING, arr ANY TYPE) AS
((SELECT value FROM UNNEST(arr) WHERE key = k));
SELECT 
  getValue('Publisher_name', Parameter) AS Publisher_name,
  getValue('device_type', Parameter) AS device_type,
  getValue('device_id', Parameter) AS device_id
FROM `project.dataset.table`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM