分析stackoverflow热门问答
stackoverflow无疑是每个程序员的圣地,里面的问和答不知道解救了多少Copy-Paste党。更难能可贵的是它开放了自己的主要数据库,允许任何人对它的数据进行下载分析。让你用自己的方式去理解数据,实在是太激动人心了。其实类似的还有Github. 本文抛砖引玉。记录了我用它来发现哪些问题和解答是非常有价值的,然后自己可以针对性的查看学习
数据源
- https://archive.org/download/stackexchange
- https://empirical-software.engineering/projects/sotorrent/
stackoverflow可能从建站之初就一直开放了自己的数据库。2014年起它将数据库拷贝托管到了archive.org,数据库文件总量极限压缩之后总大小仍然有接近100G。这还真不是一笔小的宽带费用。因此数据是每几个月更新一次。更要命的是archive上只能下载到最新一版的数据。无法得到历史版本数据。这对与有对比需求的人是很伤的,比如要分析语言流行变化趋势,哪项技术流行,哪些衰败就没辙了!!!还好有位老哥(链接二)也对分析SO敢兴趣。于是又找个了分析组织托管历史数据。至此我们分析数据的数据源有了
数据结构
- https://meta.stackexchange.com/questions/2677/database-schema-documentation-for-the-public-data-dump-and-sede
- https://sedeschema.github.io/
链接一包含各个字段的解释,链接二有更形象的图表
我个人目前只需要分析哪些问题和解答是高质量的。所以只有posts表对我有用。因此我下载了2020年3月和2017年12月的posts表
数据处理选型
- stackoverflow自己的提供的线上数据查询工具. 因为是关系型数据库,我对它的分析性能表示怀疑。没有试用
- google bigquery 试用过你会知道,这查询性能当时就震惊到我了,看起来是关系型数据库的结构,对SQL的兼容可谓是非常好。即使各种表关联也一点不慢。并且可以和bigquery平台上其他的公共数据集关联查询,然而它最大的缺点是:贵贵贵贵贵贵贵!!!!。它提供了试用,你可能进行几次查询就用光免费额度了
- clickhouse 列数据库。极致性能,而且很好上手,即便是笔记本单机也能无压力秒级分析亿级数据(磁盘最好是SSD),用在本例上是很轻松了
因此本文用了Clickhouse,安装和基础使用就不说了,我个人使用的是DataGrip作为客户端,使用csv格式导入数据库
数据转换
下载得到的数据是压缩的xml格式。很尴尬,基本没有人直接分析xml格式,所以需要先转换一下。而且即使我只下载了Posts表。其中某些字段对我也是没有用的。比如标题和内容表。精简之后能大幅减少文件大小,也有利于数据库存储和分析。下载得到Posts.xml大小15G,解压后73G。 写了个Rust脚本从xml转换到csv,没有用多进程,性能尚可
1 | use quick_xml::events::attributes::Attribute; |
以上是转换2020年3月的数据,17年12月的xml类似,以上代码减去几个字段
数据写入数据库
建表
1 | create table posts |
将csv写入clickhouse
1 | cat posts.csv | clickhouse-client --query="INSERT INTO posts2017 Format CSVWithNames"; |
将两张表合并到一张表,加速查询
1 | create table posts_all engine = MergeTree PARTITION BY toYear(create_date) ORDER BY create_date AS |
开始分析吧
一切准备就绪,接下来就是自由分析啦,这个就看个人发挥了。自己写了个仅供参考
查找C语言中有价值的问题
1 | select id, groupArray(t) x |
结果如下:
id | x |
---|---|
572547 | [‘favorite’,’view’,’score’] |
1041866 | [‘favorite’,’view’,’score’] |
47981 | [‘favorite’,’view’,’score’] |
37538 | [‘favorite’,’view’,’score’] |
1675351 | [‘favorite’,’view’,’score’] |
24853 | [‘favorite’,’view’,’score’] |
58224638 | [‘answer’,’score’,’comment’] |
612097 | [‘view’,’score’] |
1921539 | [‘view’,’score’] |
201101 | [‘view’,’score’] |
16931770 | [‘view’,’score’] |
8547778 | [‘favorite’,’score’] |
840501 | [‘favorite’,’score’] |
1410563 | [‘favorite’,’score’] |
1642028 | [‘favorite’,’score’] |
7825055 | [‘favorite’,’score’] |
605845 | [‘favorite’,’score’] |
1143262 | [‘favorite’,’score’] |
65820 | [‘favorite’,’score’] |
9229601 | [‘favorite’,’score’] |
1711631 | [‘favorite’,’score’] |
21593 | [‘favorite’,’score’] |
36827659 | [‘favorite’,’score’] |
1433204 | [‘favorite’,’score’] |
57842756 | [‘answer’,’score’] |
52509602 | [‘answer’,’favorite’] |
4264127 | [‘view’] |
3501338 | [‘view’] |
330793 | [‘view’] |
2279379 | [‘view’] |
822323 | [‘view’] |
5029840 | [‘view’] |
3437404 | [‘view’] |
38561 | [‘view’] |
2386772 | [‘view’] |
1088622 | [‘view’] |
308695 | [‘view’] |
111928 | [‘view’] |
628761 | [‘view’] |
15004944 | [‘view’] |
19641597 | [‘view’] |
27272525 | [‘view’] |
17307275 | [‘view’] |
8257714 | [‘view’] |
7021725 | [‘view’] |
8440816 | [‘view’] |
57650895 | [‘score’] |
1538420 | [‘score’] |
204476 | [‘score’] |
2550774 | [‘score’] |
381542 | [‘score’] |
5134891 | [‘favorite’] |
98650 | [‘favorite’] |
4955198 | [‘favorite’] |
31162367 | [‘favorite’] |
5431941 | [‘favorite’] |
119123 | [‘favorite’] |
63166 | [‘favorite’] |
145270 | [‘favorite’] |
81656 | [‘favorite’] |
562303 | [‘favorite’] |
55307892 | [‘comment’] |
48494733 | [‘comment’] |
48844198 | [‘comment’] |
55069186 | [‘comment’] |
55101427 | [‘comment’] |
49649253 | [‘comment’] |
50226598 | [‘comment’] |
49040259 | [‘comment’] |
50895849 | [‘comment’] |
53657018 | [‘comment’] |
48125683 | [‘comment’] |
58714944 | [‘comment’] |
48515115 | [‘comment’] |
51181037 | [‘comment’] |
48912653 | [‘comment’] |
47691216 | [‘comment’] |
48134447 | [‘comment’] |
51867939 | [‘comment’] |
53563600 | [‘comment’] |
45524284 | [‘comment’] |
47777205 | [‘comment’] |
48505911 | [‘comment’] |
48176305 | [‘comment’] |
56406841 | [‘comment’] |
47616508 | [‘comment’] |
48420442 | [‘comment’] |
48914413 | [‘comment’] |
57575599 | [‘comment’] |
52451184 | [‘comment’] |
51638803 | [‘answer’] |
53444743 | [‘answer’] |
53832063 | [‘answer’] |
50530113 | [‘answer’] |
58278260 | [‘answer’] |
50951261 | [‘answer’] |
56208872 | [‘answer’] |
49456599 | [‘answer’] |
48608993 | [‘answer’] |
53298646 | [‘answer’] |
52442415 | [‘answer’] |
466204 | [‘answer’] |
53109888 | [‘answer’] |
50288322 | [‘answer’] |
59925618 | [‘answer’] |
52359906 | [‘answer’] |
48315523 | [‘answer’] |
48868367 | [‘answer’] |
122616 | [‘answer’] |
50822596 | [‘answer’] |
47906401 | [‘answer’] |
51548994 | [‘answer’] |
48226806 | [‘answer’] |
8487986 | [‘answer’] |
2602823 | [‘answer’] |
54025987 | [‘answer’] |
60113944 | [‘answer’] |