将重复的列从 CSV 转换为嵌套的 BigQuery 表?

Posted

技术标签:

【中文标题】将重复的列从 CSV 转换为嵌套的 BigQuery 表?【英文标题】:Transform repeated columns from CSV into nested BigQuery table? 【发布时间】: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 【参考方案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。如何优化存储?

以上是关于将重复的列从 CSV 转换为嵌套的 BigQuery 表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有嵌套元素的列从其他列添加到数据框(withColumn)[重复]

PostgreSQL,试图将日期列从 csv 文件复制到表的列

将我的日期列从 Excel 导入/转换为 SQL Server 中的日期时间数据类型?

Spark - 将包含 JSON 字符串的列从 StringType 转换为 Array Type(StringType())

将 CSV 读入 Spring Boot 应用程序时,如何将数据表列从累积转换为差异?

如何将data.frame列从因子转换为数字[重复]