Python 如何在Google Big Query中对多列执行模式功能
让我们假设表中有大量GBQ列,例如:Python 如何在Google Big Query中对多列执行模式功能,python,sql,google-bigquery,Python,Sql,Google Bigquery,让我们假设表中有大量GBQ列,例如: +----+----+----+----+-----+------+ | ID | Q1 | Q2 | Q3 | ... | Q500 | +----+----+----+----+-----+------+ | 1 | 1 | 0 | 1 | ... | 2 | | 2 | 0 | 1 | 0 | ... | 3 | |... | ...| ...| ...| ... | ... | | 99 | 3 | 2 | 1 |
+----+----+----+----+-----+------+
| 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 |
+----+----+----+-----+------+
我可以使用mode来计算,但我需要显式地使用每个列名。是否有一种方法可以在不指定每个列名的情况下获得这些结果?下面是针对BigQuery标准SQL的,并与Gordon的注释相关联
#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,并且真的认为这个输出在大多数用例中更实用
但若出于某种原因,你们仍然想关注结果,那个么这里有很多关于BigQuery如何实现的帖子
另请注意:
- 上述解决方案假定您的值为INT64类型,但如果thsis是您的数据类型,则可以使用FLOAT64或NUMERIC
- 在这个示例中,我使用SUM和AVG,但您可以使用所需的任何聚合函数
#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,并且真的认为这个输出在大多数用例中更实用
但若出于某种原因,你们仍然想关注结果,那个么这里有很多关于BigQuery如何实现的帖子
另请注意:
- 上述解决方案假定您的值为INT64类型,但如果thsis是您的数据类型,则可以使用FLOAT64或NUMERIC
- 在这个示例中,我使用SUM和AVG,但您可以使用所需的任何聚合函数
Python
,因此我建议)。此外,这取决于您是否需要重复使用,或者只是一次性使用,Excel或Google Sheets也会使这项工作变得非常简单。我使用pandas完成这项任务,但由于表中有大量列和行,因此速度非常慢(同时考虑将表从GBQ发送到pandas),我认为没有。如果每个id有一行和“Q”值,代码会简单得多。我同意,但我现在无法更改表模式。现在我只是把整行从GBQ直接放到DataFrame,然后在那里进行计数,但这样做既慢又低效。直接从表中获取此类数据将是一个重要的游戏规则改变者。我可以看到如何获取列-->JSON-->数组,但不能返回到单个列。我认为最好的选择是Python中的Pandas数据帧(您将此问题标记为Python
,因此我建议)。另外,这取决于您是否需要重复使用,或者只是一次性使用,Excel或Google Sheets也会使这项工作变得非常简单。我使用pandas完成这项任务,但由于表中有大量的列和行,因此速度非常慢(还考虑将表从GBQ发送到pandas),这正是我想要的!谢谢@ŁUkaszzymankiewicz你的利率很低。您可以使用投递答案左侧投票下方的勾号标记已接受答案
。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,你可以提高自己的声望得分,同时让我们有动力来回答你的问题:O)请考虑!这正是我要找的!谢谢@ŁUkaszzymankiewicz你的利率很低。您可以使用投递答案左侧投票下方的勾号标记已接受答案
。看看为什么它很重要!对答案进行投票也很重要。投票选出有帮助的答案。。。当有人回答你的问题时,你可以检查一下该做什么。遵循这些简单的规则,你可以提高自己的声望得分,同时让我们有动力来回答你的问题:O)请考虑!