有啥有效的方法来计算大数据表列中的二进制值?

Posted

技术标签:

【中文标题】有啥有效的方法来计算大数据表列中的二进制值?【英文标题】:any efficient way to count binary values in columns of big data table?有什么有效的方法来计算大数据表列中的二进制值? 【发布时间】:2019-04-20 22:14:47 【问题描述】:

我在谷歌云平台上使用大查询芝加哥犯罪数据。但是,我想计算每种犯罪类型的逮捕和未逮捕人数。在 pandas 中计算这一点很容易,但对我来说,如何用大查询计算数据框中的二进制值并不直观。谁能给我一个可能的想法来计算这个数字?

数据

因为芝加哥犯罪数据很大,我无法在这里给出可重现的示例,但从这里预览犯罪数据非常容易:Chicago crime data

这是一个小预览:

我的大查询

SELECT
  primary_type,
  count(arrest),
  COUNTIF(year = 2015) AS arrests_2015,
  COUNTIF(year = 2016) AS arrests_2016
FROM
  `bigquery-public-data.chicago_crime.crime`
WHERE
  arrest = TRUE
  AND year IN (2001,
    2018)
  AND primary_type NOT IN ('OTHER OFFENSE', ' all non-criminal types')
GROUP BY
  primary_type,
  arrest

但是这个查询给了我空的输出,我不知道如何让它工作。

目标

从芝加哥犯罪数据表中,我想提取每种主要类型的总逮捕和未逮捕数量,我想排除 OTHER OFFENSE 和所有非犯罪类型,直到 2018 年底。

如何更正我的大查询以获得预期的输出?任何有效的大查询脚本来获得预期的查询输出?任何的想法?谢谢

【问题讨论】:

【参考方案1】:

下面应该工作

#standardSQL
SELECT
  primary_type,
  COUNT(arrest) arrest_total,
  COUNTIF(year = 2015) AS arrests_2015,
  COUNTIF(year = 2016) AS arrests_2016
FROM `bigquery-public-data.chicago_crime.crime`
WHERE arrest = TRUE
AND year BETWEEN 2001 AND 2018
AND primary_type NOT IN ('OTHER OFFENSE', ' all non-criminal types')
GROUP BY primary_type, arrest  

我认为您的问题在下面一行,您只选择了 2001 年和 2018 年,而不是两者之间的所有年份(至少包括 2015 年和 2016 年)

AND year IN (2001, 2018)   

所以,你应该使用下面的一个

AND year BETWEEN 2001 AND 2018   

另外,如果你想包括非逮捕,你可以在下面使用

#standardSQL
SELECT
  primary_type,
  arrest,
  COUNT(arrest) arrest_total,
  COUNTIF(year = 2015) AS arrests_2015,
  COUNTIF(year = 2016) AS arrests_2016
FROM `bigquery-public-data.chicago_crime.crime`
WHERE year BETWEEN 2001 AND 2018
AND primary_type NOT IN ('OTHER OFFENSE', ' all non-criminal types')
GROUP BY primary_type, arrest

注意:我在这里删除了WHERE arrest = TRUE 并将arrest 添加到SELECT 列表中

而不是这几个调整 - 你最初的查询是相当正确的

如果您希望每个 primary_type 有一个输出行,您可以在下面使用

#standardSQL
SELECT
  primary_type,
  COUNTIF(arrest) arrests,
  COUNTIF(NOT arrest) non_arrests,
  COUNT(arrest) arrest_total,
  COUNTIF(year = 2015) AS arrests_2015,
  COUNTIF(year = 2016) AS arrests_2016
FROM `bigquery-public-data.chicago_crime.crime`
WHERE year BETWEEN 2001 AND 2018
AND primary_type NOT IN ('OTHER OFFENSE', ' all non-criminal types')
GROUP BY primary_type   

此外 - 如果您可以像下面这样“扩展”年份计数(例如 2015 年)

COUNTIF(year = 2015 AND arrest) AS arrests_2015,
COUNTIF(year = 2015 AND NOT arrest) AS non_arrests_2015,  

是否有任何程序化方式来计算每种犯罪类型从 2001 年到 2018 年的逮捕人数

#standardSQL
SELECT
  primary_type,
  year,
  COUNTIF(arrest) arrests,
  COUNTIF(NOT arrest) non_arrests,
  COUNT(arrest) arrest_total
FROM `bigquery-public-data.chicago_crime.crime`
WHERE year BETWEEN 2001 AND 2018
AND primary_type NOT IN ('OTHER OFFENSE', ' all non-criminal types')
GROUP BY primary_type, year

【讨论】:

我查看 bigquery 文档,我可以计算二进制值,例如:COUNTIF(arrest=True) as num_arrest, COUNTIF(arrest=False) as num_non_arrest。如何以更紧凑的方式更改第四行和第五行?谢谢 绝对正确。更重要的是 - 因为逮捕是布尔值,你可以只使用 COUNTIF(arrest) 和 COUNTIF(NOT逮捕) - 我稍后会添加到我的答案中 我想返回每种犯罪类型每年的逮捕和未逮捕数量,您能否指出如何更有效地检索这种方法?谢谢 查看更新,我已经回答了您最初的问题。如果您有更多问题,请发布新问题,我们将非常乐意回答:o) 我认为您的意思是 ORDER BY primary_type, arrests DESC - 正如我所提到的 - 如果您还有其他问题 - 请发布新问题。这就是 SO 的工作方式。

以上是关于有啥有效的方法来计算大数据表列中的二进制值?的主要内容,如果未能解决你的问题,请参考以下文章

实施快速有效的方法来搜索非常大的数据集中的项目列表的建议/意见

根据列中的共同值将大数据框拆分为数据框列表

Linux和大数据云计算之间有啥关系?

大数据和大数据开发有啥区别?

Numpy - 如何根据其他列中的二进制值计算列中的值?

大数据方法来计算R中的距离集?