Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Google Big Query中对多列执行模式功能_Python_Sql_Google Bigquery - Fatal编程技术网

Python 如何在Google Big Query中对多列执行模式功能

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 |

让我们假设表中有大量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  |
         +----+----+----+-----+------+

我可以使用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,但您可以使用所需的任何聚合函数

下面是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,但您可以使用所需的任何聚合函数

我认为没有。如果每个id有一行和“Q”值,代码会简单得多。我同意,但我现在无法更改表模式。现在我只是把整行从GBQ直接放到DataFrame,然后在那里进行计数,但这样做既慢又低效。直接从表中获取此类数据将是一个重要的游戏规则改变者。我可以看到如何获取列-->JSON-->数组,但不能返回到单个列。我认为最好的选择是Python中的Pandas数据帧(您将此问题标记为
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)请考虑!