有一種方法可以在沒有任何本地基礎設施的情況下使用開源資料集探索 GitHub 資料。
我一直在尋找新的資料集,以用它們來展示我們團隊工作的力量。CHAOSSEARCH 可以將你的 Amazon S3 物件儲存資料轉換為完全可搜尋的 Elasticsearch 式叢集。使用 Elasticsearch API 或 Kibana 等工具,你可以查詢你所要找的任何資料。
當我找到 GHTorrent 專案進行探索時,我很興奮。GHTorrent 旨在通過 GitHub API 構建所有可用資料的離線版本。如果你喜歡資料集,這是一個值得一看的專案,甚至你可以考慮捐贈一個 GitHub API 金鑰。
有許多方法可以存取和使用 GHTorrent 的資料,它以 NDJSON 格式提供。這個專案可以以多種形式提供資料,包括用於恢復到 MySQL 資料庫的 CSV,可以轉儲所有物件的 MongoDB,以及用於將資料直接匯出到 Google 物件儲存中的 Google Big Query(免費)。 有一點需要注意:這個資料集有從 2008 年到 2017 年幾乎完整的資料集,但從 2017 年到現在的資料還不完整。這將影響我們確定性查詢的能力,但它仍然是一個令人興奮的資訊量。
我選擇 Google Big Query 來避免自己執行任何資料庫,那麼我就可以很快下載包括使用者和專案在內的完整資料庫。CHAOSSEARCH 可以原生分析 NDJSON 格式,因此在將資料上傳到 Amazon S3 之後,我能夠在幾分鐘內對其進行索引。CHAOSSEARCH 平台不要求使用者設定索引模式或定義其資料的對映,它可以發現所有欄位本身(字串、整數等)。
隨著我的資料完全索引並準備好進行搜尋和聚合,我想深入了解看看我們可以發現什麼,比如哪些軟體語言是 GitHub 專案最受歡迎的。
(關於格式化的說明:下面這是一個有效的 JSON 查詢,我們不會在這裡正確格式化以避免捲動疲勞。要正確格式化它,你可以在本地複製它並行送到命令列實用程式,如 jq。)
{"aggs":{"2":{"date_histogram":{"field":"root.created_at","interval":"1M","time_zone":"America/New_York","min_doc_count":1}}},"size":0,"_source":{"excludes":[]},"stored_fields":["*"],"script_fields":{},"docvalue_fields":["root.created_at","root.updated_at"],"query":{"bool":{"must":[],"filter":[{"match_all":{}}],"should":[],"must_not":[{"match_phrase":{"root.language":{"query":""}}}]}}}
對於那些近年來跟蹤開源語言狀態的人來說,這個結果並不令人驚訝。
JavaScript 仍然是衛冕冠軍,雖然有些人認為 JavaScript 正在逐漸消失,但它仍然是 800 磅重的大猩猩,很可能會保持這種狀態一段時間。Java 面臨類似的謠言,但這些資料表明它是開源生態系統的重要組成部分。
考慮到像 Docker 和 Kubernetes 這樣的專案的流行,你可能會想,“Go(Golang)怎麼樣?”這是一個提醒的好時機,這裡討論的 GitHub 資料集包含一些空缺,最明顯的是在 2017 年之後我看到 Golang 專案隨處可見,而這裡並沒有顯示。我希望用完整的 GitHub 資料集重複此搜尋,看看它是否會改變排名。
現在讓我們來探討專案建立的速度。 (提醒:這是為了便於閱讀而合併的有效 JSON。)
{"aggs":{"2":{"date_histogram":{"field":"root.created_at","interval":"1M","time_zone":"America/New_York","min_doc_count":1}}},"size":0,"_source":{"excludes":[]},"stored_fields":["*"],"script_fields":{},"docvalue_fields":["root.created_at","root.updated_at"],"query":{"bool":{"must":[],"filter":[{"match_all":{}}],"should":[],"must_not":[{"match_phrase":{"root.language":{"query":""}}}]}}}
我們可以看到建立新專案的速度,也會給人留下深刻的印象,從 2012 年左右開始大幅增長:
既然我知道了建立專案的速度以及用於建立這些專案的最流行的語言,我還想知道這些專案選擇的開源許可證。遺憾的是,這個 GitHub 專案資料集中並不存在這些資料,但是 Tidelift 的精彩團隊在 Libraries.io 資料 裡發布了一個 GitHub 專案的詳細列表,包括使用的許可證以及其中有關開源軟體狀態的其他詳細資訊。將此資料集匯入 CHAOSSEARCH 只花了幾分鐘,讓我看看哪些開源軟體許可證在 GitHub 上最受歡迎:
(提醒:這是為了便於閱讀而合併的有效 JSON。)
{"aggs":{"2":{"terms":{"field":"Repository License","size":10,"order":{"_count":"desc"}}}},"size":0,"_source":{"excludes":[]},"stored_fields":["*"],"script_fields":{},"docvalue_fields":["Created Timestamp","Last synced Timestamp","Latest Release Publish Timestamp","Updated Timestamp"],"query":{"bool":{"must":[],"filter":[{"match_all":{}}],"should":[],"must_not":[{"match_phrase":{"Repository License":{"query":""}}}]}}}
結果顯示了一些重要的異常值:
如你所見,MIT 許可證 和 Apache 2.0 許可證 的開源專案遠遠超過了其他大多數開源許可證,而 各種 BSD 和 GPL 許可證 則差得很遠。鑑於 GitHub 的開放模式,我不能說我對這些結果感到驚訝。我猜想是使用者(而不是公司)建立了大多數專案,並且他們使用 MIT 許可證可以使其他人輕鬆地使用、共用和貢獻。而鑑於有不少公司希望確保其商標得到尊重並為其業務提供開源元件,那麼 Apache 2.0 許可證數量高企的背後也是有道理的。
現在我確定了最受歡迎的許可證,我很想看看最少使用的許可證。通過調整我的上一個查詢,我將前 10 名逆轉為最後 10 名,並且只找到了兩個使用 伊利諾伊大學 - NCSA 開源許可證 的專案。我之前從未聽說過這個許可證,但它與 Apache 2.0 非常接近。看到所有 GitHub 專案中使用了多少個不同的軟體許可證,這很有意思。
之後,我針對特定語言(JavaScript)來檢視最常用的許可證。(提醒:這是為了便於閱讀而合併的有效JSON。)
{"aggs":{"2":{"terms":{"field":"Repository License","size":10,"order":{"_count":"desc"}}}},"size":0,"_source":{"excludes":[]},"stored_fields":["*"],"script_fields":{},"docvalue_fields":["Created Timestamp","Last synced Timestamp","Latest Release Publish Timestamp","Updated Timestamp"],"query":{"bool":{"must":[{"match_phrase":{"Repository Language":{"query":"JavaScript"}}}],"filter":[{"match_all":{}}],"should":[],"must_not":[{"match_phrase":{"Repository License":{"query":""}}}]}}}
這個輸出有一些意外。
儘管使用 npm init
建立的 NPM 模組的預設許可證是來自 Internet Systems Consortium(ISC) 的許可證,但你可以看到相當多的這些專案使用 MIT 以及 Apache 2.0 的開源許可證。
由於 Libraries.io 資料集中包含豐富的開源專案內容,並且由於 GHTorrent 資料缺少最近幾年的資料(因此缺少有關 Golang 專案的任何細節),因此我決定執行類似的查詢來檢視 Golang 專案是如何許可他們的程式碼的。
(提醒:這是為了便於閱讀而合併的有效 JSON。)
{"aggs":{"2":{"terms":{"field":"Repository License","size":10,"order":{"_count":"desc"}}}},"size":0,"_source":{"excludes":[]},"stored_fields":["*"],"script_fields":{},"docvalue_fields":["Created Timestamp","Last synced Timestamp","Latest Release Publish Timestamp","Updated Timestamp"],"query":{"bool":{"must":[{"match_phrase":{"Repository Language":{"query":"Go"}}}],"filter":[{"match_all":{}}],"should":[],"must_not":[{"match_phrase":{"Repository License":{"query":""}}}]}}}
結果與 Javascript 完全不同。
Golang 專案與 JavaScript 專案驚人逆轉 —— 使用 Apache 2.0 的 Golang 專案幾乎是 MIT 許可證的三倍。雖然很難準確地解釋為什麼會出現這種情況,但在過去的幾年中,Golang 已經出現了大規模的增長,特別是在開源和商業化的專案和軟體產品公司中。
正如我們上面所了解的,這些公司中的許多公司都希望強制執行其商標策略,因此轉向 Apache 2.0 許可證是有道理的。
最後,我通過深入了解 GitHub 使用者和專案的資料找到了一些有趣的結果。其中一些我肯定會猜到,但是一些結果對我來說也是驚喜,特別是像很少使用的 NCSA 許可證這樣的異常值。
總而言之,你可以看到 CHAOSSEARCH 平台能夠快速輕鬆地找到有趣問題的複雜答案。我無需自己執行任何資料庫就可以深入研究這個資料集,甚至可以在 Amazon S3 上以低成本的方式儲存資料,因此無需維護。 現在,我可以隨時查詢有關這些資料的任何其他問題。
你對資料提出了哪些其他問題,以及你使用了哪些資料集?請在評論或推特上告訴我 @petecheslock。
本文的一個版本最初發布在 CHAOSSEARCH,有更多結果可供發現。