如何在 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 Big Query 的列大小

如何从 Google App Script 中的文件运行保存的 Big Query 脚本? [关闭]

如何通过 Google 表格中的二维数组通过 Apps 脚本插入 Big Query?

Google Big Query 中的功能

将Big Query中的数据自动导入Google表格?

如何在 Google Big Query 中总结月份?