Bigquery/Standard SQL: 如何使用 sum() 聚合所有列(大约 100 列)?
Bigquery/Standard SQL: How can I aggregate all columns (about 100 columns) with sum()?
我正在寻找一种解决方案,以使用 sum() 函数聚合具有大约 100 列的 Bigquery table。但是 Bigquery 标准 SQL.
不允许以下查询
select sum(*)
from `dataset.Intermediate_Tables.eventCat_dummies`
group by Id
我想在 Bigquery 中进行这种聚合的原因是它能够处理大量数据。我试图在 jupyter notebook 中进行相同的聚合,但每次都失败了。这可能是因为数据量很大(7.3 GiB csv 文件)。我试过的代码如下:
df_type = type_dummies.groupby('Id', sort=False).sum()
任何人都可以就如何获取这个大型数据集的聚合数据提出任何建议 and/or 替代方案?
UPDATE WITH SAMPLE INPUT AND OUTPUT
输入数据
Id col1 col2 col3 col4
1 0 0 0 1
2 0 1 1 1
1 1 0 0 0
4 0 0 0 0
19 0 0 0 0
2 1 1 1 1
期望输出
Id col1_sum col2_sum col3_sum col4_sum
1 1 0 0 1
2 1 2 2 2
4 0 0 0 0
19 0 0 0 0
在我的原始数据集中,有 100 列和 4000 万行。
以下是 BigQuery StandardSQL 的示例
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 1 a, 2 b, 3 c UNION ALL
SELECT 1, 4, 5, 6 UNION ALL
SELECT 2, 7, 8, 9
)
SELECT id,
SUM((
SELECT SUM(CAST(SPLIT(pair, ':')[SAFE_OFFSET(1)] AS INT64))
FROM UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), r'[{}]', ''))) pair
WHERE SPLIT(pair, ':')[SAFE_OFFSET(0)] != '"id"'
)) val
FROM `project.dataset.table` t
GROUP BY id
结果为
Row id val
1 1 21
2 2 24
如您所见 - 以上与列数无关
此外,它假定除 id
列之外的所有列都需要求和。如果你有更多的列要排除 - 你可以分别调整 WHERE
子句
Update based on provided details
So you want to sum each and every individual column (initially I read your question as if you want to sum all the column's values together by id)
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 1 a, 2 b, 3 c UNION ALL
SELECT 1, 4, 5, 6 UNION ALL
SELECT 2, 7, 8, 9
)
SELECT id,
REPLACE(SPLIT(pair, ':')[SAFE_OFFSET(0)], '"', '') col,
SUM(CAST(SPLIT(pair, ':')[SAFE_OFFSET(1)] AS INT64)) val
FROM (
SELECT id,
ARRAY(
SELECT pair
FROM UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t1), r'[{}]', ''))) pair
WHERE SPLIT(pair, ':')[SAFE_OFFSET(0)] != '"id"'
) arr
FROM `project.dataset.table` t1
) t2,
UNNEST(arr) pair
GROUP BY id, col
ORDER BY id, col
这会给你下面的结果
Row id col val
1 1 a 5
2 1 b 7
3 1 c 9
4 2 a 7
5 2 b 8
6 2 c 9
此结果是您需要的扁平化版本,在大多数实际用例中比旋转版本更有效
不过,如果您想调整此结果 - 请参阅
我正在寻找一种解决方案,以使用 sum() 函数聚合具有大约 100 列的 Bigquery table。但是 Bigquery 标准 SQL.
不允许以下查询select sum(*)
from `dataset.Intermediate_Tables.eventCat_dummies`
group by Id
我想在 Bigquery 中进行这种聚合的原因是它能够处理大量数据。我试图在 jupyter notebook 中进行相同的聚合,但每次都失败了。这可能是因为数据量很大(7.3 GiB csv 文件)。我试过的代码如下:
df_type = type_dummies.groupby('Id', sort=False).sum()
任何人都可以就如何获取这个大型数据集的聚合数据提出任何建议 and/or 替代方案?
UPDATE WITH SAMPLE INPUT AND OUTPUT
输入数据
Id col1 col2 col3 col4
1 0 0 0 1
2 0 1 1 1
1 1 0 0 0
4 0 0 0 0
19 0 0 0 0
2 1 1 1 1
期望输出
Id col1_sum col2_sum col3_sum col4_sum
1 1 0 0 1
2 1 2 2 2
4 0 0 0 0
19 0 0 0 0
在我的原始数据集中,有 100 列和 4000 万行。
以下是 BigQuery StandardSQL 的示例
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 1 a, 2 b, 3 c UNION ALL
SELECT 1, 4, 5, 6 UNION ALL
SELECT 2, 7, 8, 9
)
SELECT id,
SUM((
SELECT SUM(CAST(SPLIT(pair, ':')[SAFE_OFFSET(1)] AS INT64))
FROM UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), r'[{}]', ''))) pair
WHERE SPLIT(pair, ':')[SAFE_OFFSET(0)] != '"id"'
)) val
FROM `project.dataset.table` t
GROUP BY id
结果为
Row id val
1 1 21
2 2 24
如您所见 - 以上与列数无关
此外,它假定除 id
列之外的所有列都需要求和。如果你有更多的列要排除 - 你可以分别调整 WHERE
子句
Update based on provided details
So you want to sum each and every individual column (initially I read your question as if you want to sum all the column's values together by id)
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 1 a, 2 b, 3 c UNION ALL
SELECT 1, 4, 5, 6 UNION ALL
SELECT 2, 7, 8, 9
)
SELECT id,
REPLACE(SPLIT(pair, ':')[SAFE_OFFSET(0)], '"', '') col,
SUM(CAST(SPLIT(pair, ':')[SAFE_OFFSET(1)] AS INT64)) val
FROM (
SELECT id,
ARRAY(
SELECT pair
FROM UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t1), r'[{}]', ''))) pair
WHERE SPLIT(pair, ':')[SAFE_OFFSET(0)] != '"id"'
) arr
FROM `project.dataset.table` t1
) t2,
UNNEST(arr) pair
GROUP BY id, col
ORDER BY id, col
这会给你下面的结果
Row id col val
1 1 a 5
2 1 b 7
3 1 c 9
4 2 a 7
5 2 b 8
6 2 c 9
此结果是您需要的扁平化版本,在大多数实际用例中比旋转版本更有效
不过,如果您想调整此结果 - 请参阅