Можно ли написать BigQuery для извлечения количества загрузок PyPI с течением времени? - PullRequest
0 голосов
/ 30 мая 2018

Следующий код представляет собой SQL-запрос для Google BigQuery, который подсчитывает количество загрузок моего пакета PyPI за последние 30 дней.

#standardSQL
SELECT COUNT(*) AS num_downloads
FROM `the-psf.pypi.downloads*`
WHERE file.project = 'pycotools'
  -- Only query the last 30 days of history
  AND _TABLE_SUFFIX
    BETWEEN FORMAT_DATE(
      '%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
    AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())

Можно ли изменить этот запрос так, чтобы я получал количество загрузок каждые 30 дней с момента загрузки пакета?Вывод будет .csv, который выглядит примерно так:

date          count
01-01-2016    10
01-02-2016    20
    ..        ..
01-05-2018    100

1 Ответ

0 голосов
/ 11 июля 2018

Я рекомендую использовать EXTRACT или MONTH () и считать только поле file.project, поскольку это позволит быстрее выполнять запрос.запрос, который вы можете использовать:

#standardSQL
SELECT
  EXTRACT(MONTH FROM _PARTITIONDATE) AS month_, 
  EXTRACT(YEAR FROM _PARTITIONDATE) AS year_,
  count(file.project) as count
FROM
  `the-psf.pypi.downloads*`
WHERE
  file.project= 'pycotools'
    GROUP BY 1, 2
    ORDER by 1 ASC

Я пробовал его с общедоступным набором данных:

#standardSQL
SELECT
  EXTRACT(MONTH FROM pickup_datetime) AS month_, 
  EXTRACT(YEAR FROM pickup_datetime) AS year_,
  count(rate_code) as count
FROM
  `nyc-tlc.green.trips_2015`
WHERE
  rate_code=5
GROUP BY 1, 2
ORDER by 1 ASC

или с использованием устаревшего

SELECT
  MONTH(pickup_datetime) AS month_, 
  YEAR(pickup_datetime) AS year_,
  count(rate_code) as count
FROM
  [nyc-tlc:green.trips_2015]
  WHERE
  rate_code=5
  GROUP BY 1, 2
  ORDER by 1 ASC

результат:

month_  year_   count    
1       2015    34228    
2       2015    36366    
3       2015    42221    
4       2015    41159    
5       2015    41934    
6       2015    39506        

Я вижу, что вы используете _TABLE_SUFFIX, поэтому, если вы запрашиваете секционированную таблицу, вы можете использовать столбец _PARTITIONDATE вместо форматирования даты и использования функции date_sub.Это также потребует меньше вычислительного времени.

Для запроса из одного раздела :

SELECT
  [COLUMN]
FROM
  [DATASET].[TABLE]
WHERE
  _PARTITIONDATE BETWEEN '2016-01-01'
  AND '2016-01-02'
...