【问题标题】:Transform repeated columns from CSV into nested BigQuery table?将重复的列从 CSV 转换为嵌套的 BigQuery 表?
【发布时间】:2020-08-17 08:26:40
【问题描述】:

我有一张如下所示的表格:

    a  b  c  b  c 
0   0  1  2  3  4 
1   5  6  7  8  9

我想把它转成嵌套表格:

    a  b  c 
0   0  1  2 
1      3  4  
2   5  6  7
3      8  9

我已经设法将其转换为这种格式

    a  b  c 
0   0  1  2 
1   0  3  4  
2   5  6  7
3   5  8  9

但是有没有更好的方法将其从原始 csv 转换为所需的格式?

我愿意接受 BigQuery SQL 或 Python 解决方案。

【问题讨论】:

  • 是的,请参阅 pandas 中的多索引pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html 您可以尝试在 youtube 上观看一些视频
  • 请显示您用于转换的代码。并且您的原始表具有 BQ 不允许的重复列名。这个问题没有意义。
  • @GordonLinoff BQ中的列名是a b1 c1 b2 c2。

标签: python sql csv google-bigquery etl


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
WITH `I have managed to transform it to this format` AS (
  -- replace below with whatever query you used to get to this format 
  SELECT 0 a, 1 b, 2 c UNION ALL
  SELECT 0, 3, 4 UNION ALL
  SELECT 5, 6, 7 UNION ALL
  SELECT 5, 8, 9 
)
SELECT a, ARRAY_AGG(b) b, ARRAY_AGG(c) c
FROM `I have managed to transform it to this format`
GROUP BY a 

有输出

Row a   b   c    
1   0   1   2    
        3   4    
2   5   6   7    
        8   9      

更新根据您最近的 cmets The column names in BQ [actually] are a b1 c1 b2 c2

在这种情况下,它就像下面一样简单

#standardSQL
SELECT a, [b1, b2] b, [c1, c2] c
FROM `project.dataset.table`   

您可以使用您问题中的示例数据进行测试,如以下示例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 0 a, 1 b1, 2 c1, 3 b2, 4 c2 UNION ALL 
  SELECT 5, 6, 7, 8, 9
)
SELECT a, [b1, b2] b, [c1, c2] c
FROM `project.dataset.table`   

有输出

Row a   b   c    
1   0   1   2    
        3   4    
2   5   6   7    
        8   9    

【讨论】:

  • SELECT a, [b1, b2] b 并出现错误:数组不能有空元素,写入字段时出错b
  • 确实如此。数组不能有 null 元素 - 那么你想用什么值替换 null 呢?
  • 如果我用 0 代替 null 会怎样?
  • 在这种情况下 - 只需简单地将 [b1, b2] 替换为 [IFNULL(b1, 0), IFNULL(b2, 0)] - [c1, c2] 相同
  • 它可以工作,但我有b1,b2, ... , b20,还有很多空元素,目前每行有20个“嵌套行”,大部分是0。如何优化存储?
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 2021-12-01
  • 2017-08-02
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2018-01-07
相关资源
最近更新 更多