跟踪GitHub上前100个存储库的增长情况?

时间:2012-12-14 14:04:13

标签: sql join github google-bigquery github-archive

我试图跟踪GitHub上前100个存储库的增长情况。我有以下查询:

SELECT MAX(repository_forks) as forks, repository_url 
FROM [publicdata:samples.github_timeline] 
WHERE (created_at CONTAINS "2012-04-01") 
GROUP BY repository_url 
ORDER BY forks DESC LIMIT 100

2012年4月1日,它为我提供了100个最大的存储库。然后我想跟踪每个存储库每个月的叉数增长情况。

因此我构建了以下查询:

SELECT repository_name, created_at as month,
SUM(repository_forks) as forks
FROM [githubarchive:github.timeline]
WHERE (repository_name = "rubinius")
GROUP BY repository_name, month
ORDER BY month DESC;

这种给了我想要的东西,但并不完全。相反,我需要查询:

  • 为每个月(每个回购)的叉子总数提供一个数字
  • 搜索第一个查询中标识的100个存储库

我该如何做到这一点?

1 个答案:

答案 0 :(得分:2)

[publicdata:samples.github_timeline]中的数据看起来像是不同时间戳的每个存储库的快照。如果是这种情况,为了计算每月每个回购的分叉数的变化,我认为你不应该做SUM(repository_forks)。相反,您希望获取每月的第一个快照和最后一个快照,并进行minus计算以获得delta

结果来自以下查询:

select repository_name, created_at, repository_forks  
from [publicdata:samples.github_timeline]
where repository_name='Bukkit'
order by created_at;

enter image description here

但是,我不明白为什么在2012-03-11 08:30:21Bukkit的repository_forks数量为零。这可能是数据错误?如果是数据错误,我会将它们视为异常值。设置一些阈值可能能够删除这些异常值。请注意我设置的阈值:where repository_forks > 10以跳过错误数据。

SELECT top100.repository_name, 
  substr(created_at, 0, 7) month, 
  max(repository_forks)-min(repository_forks) monthly_increase, 
  min(repository_forks) monthly_begin_at, 
  max(repository_forks) monthly_end_with 
FROM [githubarchive:github.timeline] timeline
JOIN
(SELECT repository_name , MAX(repository_forks) as forks 
FROM [githubarchive:github.timeline] 
WHERE (created_at CONTAINS "2012-04-01") 
GROUP BY repository_name 
ORDER BY forks DESC LIMIT 100) top100
on timeline.repository_name = top100.repository_name
where repository_forks > 10
GROUP BY top100.repository_name, month
ORDER BY top100.repository_name, month;

结果如下:

enter image description here

如果我错了并且repository_forks的数量已经发生了变化,那么您可以继续按照您的操作对存储库执行操作。然后它实际上更容易:

SELECT repository_name, substr(created_at,0,7) as month, SUM(repository_forks) as forks
FROM [publicdata:samples.github_timeline] timeline
JOIN
(SELECT repository_url , MAX(repository_forks) as forks 
FROM [publicdata:samples.github_timeline] 
WHERE (created_at CONTAINS "2012-04-01") 
GROUP BY repository_url 
ORDER BY forks DESC LIMIT 100) top100
on timeline.repository_url = top100.repository_url
GROUP BY repository_name, month
ORDER BY repository_name, month DESC;

enter image description here

更新

是肯定的。我将数据集更改为指向githubarchive:github.timeline,然后我将数据保存到2012年12月。相应的sql和结果会更新。但是数据质量不好,仍然会看到很多outlier个数据点。