如何在 Google Big Query 中的多个列上执行模式功能
Posted
技术标签:
【中文标题】如何在 Google Big Query 中的多个列上执行模式功能【英文标题】:How to perform mode function on multiple columns in Google Big Query 【发布时间】:2019-08-13 13:51:03 【问题描述】:假设GBQ中有大量列的表,例如:
+----+----+----+----+-----+------+
| ID | Q1 | Q2 | Q3 | ... | Q500 |
+----+----+----+----+-----+------+
| 1 | 1 | 0 | 1 | ... | 2 |
| 2 | 0 | 1 | 0 | ... | 3 |
|... | ...| ...| ...| ... | ... |
| 99 | 3 | 2 | 1 | ... | 0 |
+----+----+----+----+-----+------+
我想使用 MODE 和 COUNT 函数对每一列执行查询,以获得最频繁的值及其每列的计数,例如:
+----+----+----+-----+------+
(column) | Q1 | Q2 | Q3 | ... | Q500 |
(mode) | 0 | 1 | 3 | ... | 2 |
(count) | 10 | 56 | 23 | ... | 50 |
+----+----+----+-----+------+
我可以使用模式来计算这个,但我需要明确地使用每个列名。是否有一种解决方法可以在不指定每个列名的情况下获得这些结果?
【问题讨论】:
我认为没有。如果每个 id 和“Q”值只有一行,您的代码会简单得多。 我同意,但目前我无法更改表架构。现在我只是把整行从 GBQ 直接放到 DataFrame 并在那里计数,但它很慢而且效率低下。直接从表格中获取此类数据将是一个重大的游戏规则改变者。 我可以看到如何获取列 --> JSON --> 数组,但不能返回单个列。 我认为你最好的选择是 Python 中的 Pandas 数据框(你有这个问题用python
标记,因此我的建议)。此外,根据您是否需要反复使用或一次性使用,Excel 或 Google 表格也会让这变得非常简单。
我在这个任务中使用了 pandas,但是由于表中有大量的列和行,这完全是缓慢的(还考虑将表从 GBQ 发送到 Pandas)
【参考方案1】:
以下是 BigQuery 标准 SQL 并与 Gordon 的 cmets 内联
#standardSQL
SELECT column,
SUM(value) total_value,
AVG(value) avg_value
FROM (
SELECT
SPLIT(kv, ':')[OFFSET(0)] column,
CAST(SPLIT(kv, ':')[OFFSET(1)] AS INT64) value
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), r'["]', ''))) kv
)
WHERE column != 'id'
GROUP BY column
它会产生类似下面的东西
Row column total_value avg_value
1 q1 4 1.3333333333333333
2 q2 3 1.0
3 q3 2 0.6666666666666666
... ... ... ...
500 q500 5 1.6666666666666667
我支持 Gordon,真的认为这个输出在大多数用例中更实用
但如果出于某种原因您仍想调整结果 - 在 SO for BigQuery 上有很多关于如何执行此操作的帖子
另请注意:
上述解决方案假定您的值是 INT64 类型,但如果这是您拥有的数据类型,您可以使用 FLOAT64 或 NUMERIC 在示例中我使用 SUM 和 AVG,但您可以使用任何您需要的聚合函数【讨论】:
这正是我想要的!谢谢!以上是关于如何在 Google Big Query 中的多个列上执行模式功能的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Google App Script 中的文件运行保存的 Big Query 脚本? [关闭]