Как оптимизировать Google-BigQuery для поиска наиболее часто встречающихся категорий из таблицы больших данных? - PullRequest
0 голосов
/ 21 апреля 2019

Я использую google-bigquery в наборе криминальных данных Чикаго.Однако я хочу выяснить наиболее частый тип преступления из столбца primary_type для каждого отдельного block.Для этого я захожу по standardSQL.

Данные:

Поскольку данные о преступности в Чикаго достаточно велики, существует официальный сайт, где вы можете просмотретьнабор данных: данные о преступности в облаке Google

Мой текущий стандартный 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)).Я хочу найти наиболее частый тип преступления.В моем конечном выводе я ожидаю три столбца, такие как block, primary_type, count.Есть ли способ сделать это с google-bigquery?

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Это должно дать вам наиболее частое преступление по блоку

Счетчик внутренних запросов вычисляет частоту преступлений, функция разделения окон вычисляет ранг на основе убывания частоты преступлений, разделенных на блоки. внешний запрос, где условие rank = 1, возвращает только наиболее частое преступление. Вы можете изменить внешний запрос where, чтобы получить 5 самых распространенных преступлений, сделав его ранжированным <= 5 </p>


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


1 голос
/ 21 апреля 2019

Ниже для BigQuery Standard 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
...