如何优化google-bigquery以从大数据表中查找最频繁的类别?

时间:2019-04-21 00:37:01

标签: python google-bigquery bigdata standard-sql

我在芝加哥犯罪数据集上使用google-bigquery。但是,我想从primary_type栏中找出每个不同的block的最常见犯罪类型。为此,我遵循standardSQL

数据:

由于芝加哥犯罪数据相当大,因此有一个官方网站可以预览数据集:crime data on Google cloud

我当前的标准SQL:

SELECT primary_type,block, COUNT(*) as count
FROM `bigquery-public-data.chicago_crime.crime` 
HAVING COUNT(*) = (SELECT MAX(count)
  FROM (SELECT primary_type, COUNT(*) as count FROM `bigquery-public-data.chicago_crime.crime` GROUP BY primary_type, block) `bigquery-public-data.chicago_crime.crime`)

我上面的查询的问题是现在有一个错误,对我来说,即使我修复了这个错误,该查询的效率也很低。如何解决和优化上述查询?

如何在标准SQL中使用正则表达式:

要计算每个区块(包括北方和南方)的最频繁类型,我必须处理regex,例如033XX S WOOD ST,我应该只得到S WOOT ST,并且033XX N WOOD ST。我需要获取N WOOD ST并获得这些计数。我该怎么办?

所需的输出:

在我想要的输出中,对于每个块,例如WOOD ST (North (N WOOD ST)South(S WOOD ST))上的块。我想找到最常见的犯罪类型。在最终输出中,我期望三列,例如blockprimary_typecount。有没有办法通过google-bigquery完成此任务?

2 个答案:

答案 0 :(得分:1)

以下是用于BigQuery标准SQL

#standardSQL
SELECT
  block,
  ARRAY_AGG(STRUCT(primary_type, cnt) ORDER BY cnt DESC LIMIT 1)[OFFSET(0)].*
FROM (
  SELECT 
    block,
    primary_type, 
    COUNT(*) cnt
  FROM `bigquery-public-data.chicago_crime.crime` 
  GROUP BY block, primary_type
)
GROUP BY block   
  

如何获得WOOD ST街区最常见的犯罪类型?任何黑客做到这一点?

我对这些数据的细节不熟悉,但是从简短的眼光看-我认为您可以在下面尝试

#standardSQL
SELECT
  block,
  ARRAY_AGG(STRUCT(primary_type, cnt) ORDER BY cnt DESC LIMIT 1)[OFFSET(0)].*
FROM (
  SELECT 
    SUBSTR(block, 8) block,
    primary_type, 
    COUNT(*) cnt
  FROM `bigquery-public-data.chicago_crime.crime` 
  GROUP BY block, primary_type
)
GROUP BY block

答案 1 :(得分:1)

这应该可以让您分批查看最常见的犯罪

内部查询次数计算犯罪发生率,窗口划分功能根据按块划分的犯罪发生频率的降序计算排名。外部查询,其中子句rank = 1仅返回最常见的犯罪。您可以更改外部查询where子句,使其排名为<= 5

,从而获得前5名常见犯罪
select * from 
      (SELECT block, primary_type, count(primary_type) as crime_frquency, 
            ROW_NUMBER() OVER (PARTITION BY block ORDER BY count(primary_type) DESC) AS rank
       FROM  `bigquery-public-data.chicago_crime.crime` 
       group by block, primary_type)
where rank = 1