Reddit наборы данных в BigQuery - запрос талантов? - PullRequest
1 голос
/ 31 января 2020

Я знаю, что в BigQuery есть свалка комментариев и историй reddit, собранная Джейсоном Баумгартнером из pushshift.io.

Как я могу запросить этот набор данных, чтобы получить список талантов для subreddit?

Это базовый запрос, который у меня есть:

SELECT link_flair_text 
FROM `fh-bigquery.reddit_posts.2019_08` 
WHERE subreddit  = 'AmItheAsshole'

1 Ответ

2 голосов
/ 31 января 2020

Давайте построим эту визуализацию:

enter image description here

Запрос, подобный этому, будет делать - этот получает количество сообщений на / r / AmITheAsshole, упорядоченное по наиболее типичному суждению:

SELECT link_flair_text, COUNT(*) c 
FROM `fh-bigquery.reddit_posts.2019_08` 
WHERE subreddit  = 'AmItheAsshole'
GROUP BY 1
ORDER BY 2 DESC 
LIMIT 1000

enter image description here

Чтобы запросить данные за несколько месяцев, вы можете использовать * на FROM:

SELECT link_flair_text, COUNT(*) c 
FROM `fh-bigquery.reddit_posts.2019_*` 
WHERE subreddit  = 'AmItheAsshole'
GROUP BY 1
ORDER BY 2 DESC 
LIMIT 1000

enter image description here

И, чтобы увидеть эволюцию в процентах в месяц:

SELECT link_flair_text, ARRAY_AGG(STRUCT(month, ROUND(100*c/total_month,1) AS perc, c) ORDER BY month) AS arr
FROM (
  SELECT *, SUM(c) OVER(PARTITION BY month) total_month
  FROM (
    SELECT link_flair_text, DATE(TIMESTAMP_TRUNC(TIMESTAMP_SECONDS(created_utc), MONTH)) month, COUNT(*) c
    FROM `fh-bigquery.reddit_posts.2019_*` 
    WHERE subreddit  = 'AmItheAsshole'
    AND link_flair_text IS NOT NULL
    GROUP BY 1,2 
    HAVING c > 100
  )
)
GROUP BY 1
ORDER BY SUM(c) DESC

enter image description here

И SQL для визы, показанной выше:

CREATE OR REPLACE TABLE `temp.assholes`
AS
SELECT *, c/total_month AS perc
FROM (
  SELECT *, SUM(c) OVER(PARTITION BY month) total_month, SUM(c) OVER(PARTITION BY link_flair_text) total_flair
  FROM (
    SELECT LOWER(link_flair_text) link_flair_text, DATE(TIMESTAMP_TRUNC(TIMESTAMP_SECONDS(created_utc), MONTH)) month, COUNT(*) c
    FROM `fh-bigquery.reddit_posts.201*` 
    WHERE subreddit = 'AmItheAsshole'
    AND link_flair_text IS NOT NULL
    AND _table_suffix >= '8_03'
    GROUP BY 1,2 
  )
)
WHERE c/total_month > 0.01
AND total_flair > 1000
ORDER BY month

Как доставить данные до 2016 года?

Почти тот же запрос, но он включает в себя другую таблицу, в которой содержится все содержимое c истории до 2016 года:

WITH data AS (
  SELECT * FROM `fh-bigquery.reddit_posts.201*` WHERE _table_suffix >= '5_12'
  UNION ALL  
  SELECT * FROM `fh-bigquery.reddit_posts.full_corpus_201512`  
)

SELECT *, c/total_month AS perc
FROM (
  SELECT *, SUM(c) OVER(PARTITION BY month) total_month, SUM(c) OVER(PARTITION BY link_flair_text) total_flair
  FROM (
    SELECT LOWER(link_flair_text) link_flair_text, DATE(TIMESTAMP_TRUNC(TIMESTAMP_SECONDS(created_utc), MONTH)) month, COUNT(*) c
    FROM data
    WHERE subreddit  = 'AmItheAsshole'
    AND link_flair_text IS NOT NULL
    GROUP BY 1,2 
  )
)
WHERE c/total_month > 0.01
AND total_flair > 1000
ORDER BY month
...