将重复的列从 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())