有啥有效的方法来计算大数据表列中的二进制值?
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 的工作方式。以上是关于有啥有效的方法来计算大数据表列中的二进制值?的主要内容,如果未能解决你的问题,请参考以下文章