【问题标题】:What's the best way to parse BigQuery Array into Columns将 BigQuery 数组解析为列的最佳方法是什么
【发布时间】:2020-04-10 03:33:37
【问题描述】:

我有一张这样的桌子

select 'Alice' as Name, ['a=1','b=2','c=3'];

我希望它把它变成这个

select 'Alice' as Name, 1 as a, 2 as b, 3 as c

最好的方法是什么?

我正在考虑也许首先使用结构

select 'Alice' as Name, [struct('a' as Letter, 1 as Number),struct('b' as Letter, 2 as Number) ,struct('c' as Letter, 3 as Number)]  as struct_column

【问题讨论】:

  • 由于没有“动态列名”,您是否事先知道查询中将包含哪些列,或者您真的需要“动态”列名?
  • 好问题,不,我不需要它是动态的

标签: arrays struct google-bigquery


【解决方案1】:

假设您事先不知道“未来”列的名称和数量 - 我建议您将其展平,如下例所示(BigQuery 标准 SQL)

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Alice' AS Name, ['a=1','b=2','c=3'] attributes UNION ALL
  SELECT 'Cheshire Cat', ['a=4', 'x=5'] UNION ALL
  SELECT 'White Rabbit', ['a=6', 'c=7'] 
)
SELECT Name, 
  SPLIT(kv, '=')[OFFSET(0)] key, 
  SPLIT(kv, '=')[SAFE_OFFSET(1)] value  
FROM `project.dataset.table`, UNNEST(attributes) kv   

结果

Row Name            key value    
1   Alice           a   1    
2   Alice           b   2    
3   Alice           c   3    
4   Cheshire Cat    a   4    
5   Cheshire Cat    x   5    
6   White Rabbit    a   6    
7   White Rabbit    c   7     

我确实提前知道属性...

在这种情况下,下面将起作用

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Alice' AS Name, ['a=1','b=2','c=3'] attributes UNION ALL
  SELECT 'Cheshire Cat', ['a=4', 'b=5'] UNION ALL
  SELECT 'White Rabbit', ['a=6', 'c=7'] 
)
SELECT Name,
  MAX(IF(key = 'a', value, NULL)) a,
  MAX(IF(key = 'b', value, NULL)) b,
  MAX(IF(key = 'c', value, NULL)) c
FROM (
  SELECT Name, 
    SPLIT(kv, '=')[OFFSET(0)] key, 
    SPLIT(kv, '=')[SAFE_OFFSET(1)] value  
  FROM `project.dataset.table`, UNNEST(attributes) kv   
)
GROUP BY Name   

结果

Row Name            a       b       c    
1   Alice           1       2       3    
2   Cheshire Cat    4       5       null     
3   White Rabbit    6       null    7    

【讨论】:

  • 是的,我确实事先知道属性,所以在此之后最好的步骤就是将 max(if(key =a,value,'') 作为 a
  • 很高兴它对你有用。也考虑投票:o)和顺便说一句。我认为在max(if(key =a,value,'')中使用NULL比''更准确
  • 我看到 safe_offset 是基于 0 的,但如果它与 offset 相同,我就不知道它的存在?
  • 您可以使用 SAFE_OFFSET(0),但是当数组中的第一个 (0) 元素不存在时,确实不存在这种情况——这就是我只使用 OFFSET(0) 的原因。虽然数组可能只有第一个 (0) 元素而不是第二个 (1),所以我使用 SAFE_OFFSET(1) 来避免错误,而不是在这种情况下只获得 NULL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 2019-09-16
  • 1970-01-01
  • 2010-09-14
  • 2022-01-06
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多