本文共 6131 字,大约阅读时间需要 20 分钟。
村上春树(日本后现代主义作家)有一本书,《当我跑步时,我谈些什么》,Felipe这篇文章的统计数据和这本书有点类似,周末的时间我们会使用什么语言进行编程,看了他的文章,我们会知道在办公室里使用的语言,不过是谋生工具而已,私底下大家并不喜欢它们。
\\下面这张表格的内容是2016年度排名前20位的周末编程语言,根据(全球领先的软件开发平台)、(监控着GitHub上的每一次更改,并将每一次更改的更新内容,以JSON字符串形式存储在MongoDB数据库)、(谷歌的数据仓库)等三个平台数据作为分析数据源。
\\ \\从上面这张表格我们可以看到,排名前二十位的分别是:
\\这个排名很清晰地告诉我们,2016年属于Functional Languages(函数型语言),以及3D世界的脚本语言。另外学习Java的朋友可以发现,Java没有入选,但是很多函数型语言可以基于JVM运行,这给了我们一个提示,即未来JVM将会包容更多的语言,而不仅仅是Java语言本身。
\\再来看看后20位语言,你会发现很多我们日常谋生的语言都在这里呢,包括:
\\让我们看看这些2016年流行的周末“Happy Hour”语言的变化趋势,如图所示:
\\ \\我们解释一下上面这张图所表达的含义:
\\那么其他语言是如何按照流行程度排序的?请看下面这张图:
\\ \\作者列举了一些来自reddit和HN的问题,并作出回复。
\\说:“我妈妈说了,我只能在星期天的下午4点到6点使用Rust”。
\\\\\很多人和你一样!Rust这几年来都位居周末语言榜首。但是回到2010年,它也是工作日语言之一。
\
:“我现在需要GitHub出一份报告,报告中需要说明哪些语言分别在周末、工作日被提交的次数最多”。
\\\\\放心,会有的。
\
:“谁在周末玩Assembly?”
\\\\\也许是学生做家庭作业?Assembly这门语言在这里其实不是很知名,也许是有人在Stack
\Overflow里搜索问题答案,其实并不是真的想写代码。\
作者使用BigQuery快速地分析了这些数据集,只用了5分钟时间。
\\对2016年流行语言进行排名,代码如下:
\\\#standardSQL\SELECT lang\ , ROUND(weekend/weekday,2) ratio\ , weekday, weekend\ , repos[OFFSET(0)].value sample_repo, repos[OFFSET(1)].value sample_repo_2\FROM (\ SELECT lang, month\ , MAX(IF(weekday,c,null)) weekday, MAX(IF(NOT weekday,c,null)) weekend\ , ANY_VALUE(repos) repos\ FROM (\ SELECT language lang, TIMESTAMP_TRUNC(created_at, YEAR) month\ , EXTRACT(DAYOFWEEK FROM a.created_at) BETWEEN 2 AND 6 weekday\ , COUNT(DISTINCT committer_id) c\ , APPROX_TOP_COUNT(repo, 3) repos\ FROM `ghtorrent-bq.ght_2017_01_19.commits` a\ JOIN `fh-bigquery.github_extracts.ght_project_languages` b\ ON a.project_id=b.project_id\ WHERE b.percent\u0026gt;0.25\ AND EXTRACT(YEAR FROM a.created_at) BETWEEN 2016 AND 2016\ GROUP BY 1,2,3\ HAVING c\u0026gt;100\ )\ GROUP BY 1,2\)\WHERE (weekend+weekday)\u0026gt;1450\ORDER BY ratio DESC\\\
对2010-2016年的数据画图,代码如下:
\\\#standardSQL\SELECT *\FROM (\ SELECT *, 40-rn inv_rank, ROW_NUMBER() OVER(PARTITION BY month ORDER BY ratio) weekend_rank,\ MAX(month) OVER(PARTITION BY lang) max_month\ FROM (\ SELECT lang, month\ , ROUND(weekend/weekday,2) ratio\ , weekday, weekend, weekday+weekend total\ , repos[OFFSET(0)].value sample_repo\ , ROW_NUMBER() OVER(PARTITION BY month ORDER BY weekday+weekend DESC) rn\ FROM (\ SELECT lang, month\ , MAX(IF(weekday,c,null)) weekday, MAX(IF(NOT weekday,c,null)) weekend\ , ANY_VALUE(repos) repos\ FROM (\ SELECT language lang, TIMESTAMP_TRUNC(created_at, YEAR) month\ , EXTRACT(DAYOFWEEK FROM a.created_at) BETWEEN 2 AND 6 weekday\ , COUNT(DISTINCT committer_id) c\ , APPROX_TOP_COUNT(repo, 3) repos\ FROM `ghtorrent-bq.ght_2017_01_19.commits` a\ JOIN `fh-bigquery.github_extracts.ght_project_languages` b\ ON a.project_id=b.project_id\ WHERE b.percent\u0026gt;0.25\ AND language IN UNNEST(SPLIT('rust,haskell,c,clojure,arduino,ruby,python,go,r,puppet,xml'))\ AND EXTRACT(YEAR FROM a.created_at) BETWEEN 2010 AND 2016\ GROUP BY 1,2,3\ )\ GROUP BY 1,2\ )\ )\ WHERE rn\u0026lt;=40\)\ORDER BY 2,3 DESC\\\
外部查询语句:
\\\SELECT lang\ , EXTRACT(DAYOFWEEK FROM date) BETWEEN 2 AND 6 weekday\ , COUNT(DISTINCT email) c\ , APPROX_TOP_COUNT(repo, 3) repos\FROM (\ SELECT author.email, LOWER(REGEXP_EXTRACT(diff.new_path, r'\\.([^\\./\\(~_ \\- #]*)$')) lang, author.date, repo_name[OFFSET(0)] repo\ FROM `bigquery-public-data.github_repos.commits`, UNNEST(difference) diff \ WHERE EXTRACT(YEAR FROM author.date)=2016\)\WHERE lang IS NOT null\AND LENGTH(lang)\u0026lt;8\AND REGEXP_CONTAINS(lang, '[a-zA-Z]')\GROUP BY 1,2\HAVING c\u0026gt;100\ORDER BY c DESC\\\
如何衡量数据:
\\\SELECT lang\ , MAX(IF(weekday,c,null)) weekday, MAX(IF(NOT weekday,c,null)) weekend , ANY_VALUE(repos) repos\FROM (\ SELECT JSON_EXTRACT_SCALAR(payload, '$.pull_request.head.repo.language') lang\ , EXTRACT(DAYOFWEEK FROM created_at) BETWEEN 2 AND 6 weekday\ , APPROX_TOP_COUNT(repo.name, 3) repos\ , COUNT(DISTINCT actor.id) c\ FROM `githubarchive.year.2016`\ WHERE type='PullRequestEvent'\ GROUP BY 1,2\)\GROUP BY 1\\\
备注:这个帖子中,作者主要使用了最新的,也许这些资料对读者也有用,、、。
\\原文地址:
\\:
\\感谢对本文的审校。
\\给InfoQ中文站投稿或者参与内容翻译工作,请邮件至。也欢迎大家通过新浪微博(,),微信(微信号:)关注我们。
转载地址:http://yfuhl.baihongyu.com/