scala專案開發知識儲備
Scala專案預備
本文件寫的很詳細。因為工程量浩大,內容會涉及超級多的引用。本文件前部分詳細描述基礎知識,最後將引入實際需求應用。
來說說為什麼用scala
- 我看spark原始碼,由scala開發,非常的優雅、簡潔,是一個偉大而令人興奮的語言。
- 一定程度上替代java開發,僅僅是一定程度上,任然有許多場景非java不可。請注意我的措辭,在一定場景中,scala開發比java來的快捷方便。
- 函數語言程式設計妙不可言,只有真的使用過後才會愛不釋手。個人感覺就是,爽到無法呼吸的愛上她。
怎麼用
關於怎麼搭建,很簡單。請看這篇文章,我不廢話。
遇到搭建環境的小坑
寫到這就得說道說道了。這兩個小問題是當時第一次整遇到了,後面解決了,並做告知,提醒後來人。
- 沒有new scala
備註:src為sources
開啟設定介面的路徑如下: 主介面File——>Project Structure——>modules
- 如上圖紅圈所示,我們可以根據對專案的任意目錄進行這五種目錄型別標註,這個知識點非常非常重要,必須會。
- Sources 一般用於標註類似 src 這種可編譯目錄。有時候我們不單單專案的 src 目錄要可編譯,還有其他一些特別的目錄也許我們也要作為可編譯的目錄,就需要對該目錄進行此標註。只有 Sources 這種可編譯目錄才可以新建 Java 類和包,這一點需要牢記。
- Tests 一般用於標註可編譯的單元測試目錄。在規範的 maven 專案結構中,頂級目錄是 src,maven 的 src 我們是不會設定為 Sources 的,而是在其子目錄 main 目錄下的 java 目錄,我們會設定為 Sources。而單元測試的目錄是 src - test - java,這裡的 java 目錄我們就會設定為 Tests,表示該目錄是作為可編譯的單元測試目錄。一般這個和後面幾個我們都是在 maven 專案下進行配置的,但是我這裡還是會先說說。從這一點我們也可以看出 IntelliJ IDEA 對 maven 專案的支援是比徹底的。
- Resources 一般用於標註資原始檔目錄。在 maven 專案下,資源目錄是單獨劃分出來的,其目錄為:src - main -resources,這裡的 resources 目錄我們就會設定為 Resources,表示該目錄是作為資源目錄。資源目錄下的檔案是會被編譯到輸出目錄下的。
- Test Resources 一般用於標註單元測試的資原始檔目錄。在 maven 專案下,單元測試的資源目錄是單獨劃分出來的,其目錄為:src - test -resources,這裡的 resources 目錄我們就會設定為 Test Resources,表示該目錄是作為單元測試的資源目錄。資源目錄下的檔案是會被編譯到輸出目錄下的。
- Excluded 一般用於標註排除目錄。被排除的目錄不會被 IntelliJ IDEA 建立索引,相當於被 IntelliJ IDEA 廢棄,該目錄下的程式碼檔案是不具備程式碼檢查和智慧提示等常規程式碼功能。
通過上面的介紹,我們知道對於非 maven 專案我們只要會設定 src 即可。如上圖箭頭所示,被標註的目錄會在右側有一個總的概括。其中 classes 雖然是 Excluded 目錄,但是它有特殊性,可以不顯示在這裡。
然後就有了。
- 沒有run as scala
備註:沒有建立object
檔案建錯了,應該建一個object而不是建一個class。
基本資料結構
這裡有一篇詳細的不能再詳細的了
或者可以和我一樣,整本書過一過,作為工具書。
來研究一下scala強大的集合
時間關係。
Scala集合類詳解:
這裡說一下,用的最多的還是mutable.ListBuffer,mutable.HashMap了
這裡拓展一下集合排序的知識。
scala集合轉換操作:
瞭解一下集合常用api,sortBy、foreach、map、flatMap、reduce操作
來研究dataframe
前段時間做了python資料集的需求,熟悉python的pandas、numpy類庫,再來理解scala的dataframe會熟悉很多。
也不是很想扯,可以參看以下簡書內容,寫的很詳細
可惜的是,scala、java沒有直接的類庫來操作dataframe,除了引入spark環境之外,dataframe類庫目前也沒有找到,只有一個朋友在git上面分享了一部分dataframe的功能的原始碼,所以說,這點python也是強大到沒有朋友。
參看上述博文,你會發現,dataframe操作,極大地提高了程式設計效率,有多極大呢,開發三天的東西,dataframe兩三行程式碼就能搞定。
準備poi的知識
不用多說哦,看下就好啦。
關於poi的話,poi-ooxml聽說是進階版,在大資料量的excel讀取會效率更加高。也不用聽說了,就決定了,用ooxml了,我使用版本3.17
當然在網上找到的關於poi畫出來的cell美化的內容也需要理解一番,也是我們程式v1.1的內容。
所以總結一下吧,用poi-ooxml原因有二,他是poi的升級版本;處理量更加大。
同時在普及一個知識,XSSFWorkbook是2007版本,HSSFWorkbook是2003版本,前者是xlsx字尾,後者是xls字尾,生成檔案時不要搞錯了哦。
因為這裡遇到過一個小問題。
問題
在使用poi-3.15-beta2版本解析excel時, 發現並有網友所說的WorkbookFactory類.
原因
從poi-3.7.jar開始, WorkbookFactory類已經放進poi-ooxml-XXX.jar中了.
解決方法
同時引入這兩個jar包: poi-3.15-beta2.jar, poi-ooxml-3.15-beta2.jar
Sbt原理以及應用
好了,講講sbt吧,可能我們接觸maven較多,那麼之前我也是一直使用maven,構建maven專案。
groupid和artifactId被統稱為“座標”是為了保證專案唯一性而提出的,如果你要把你專案弄到maven本地倉庫去,你想要找到你的專案就必須根據這兩個id去查詢。
groupId一般分為多個段,這裡我只說兩段,第一段為域,第二段為公司名稱。域又分為org、com、cn等等許多,其中org為非營利組織,com為商業組織。舉個apache公司的tomcat專案例子:這個專案的groupId是org.apache,它的域是org(因為tomcat是非營利專案),公司名稱是apache,artigactId是tomcat。
比如我建立一個專案,我一般會將groupId設定為cn.snowin,cn表示域為中國,snowin是我個人姓名縮寫,artifactId設定為testProj,表示你這個專案的名稱是testProj,依照這個設定,你的包結構最好是cn.snowin.testProj打頭的,如果有個StudentDao,它的全路徑就是cn.snowin.testProj.dao.StudentDao
定義好了即可使用。
但是!本次,不想使用maven,就用sbt,雖然吐槽一下構建實在是慢,龜速吧。
先來舉個例子吧,在build.sbt中
然後注意依賴規則:
libraryDependencies += groupId % revision % configuration
截圖舉例:
如果還是不清楚不理解的,可以看這篇博文:
會告知怎麼整合。
都說到這裡了,那接著來說一下sbt構建時,jar衝突吧。以下博文圖文並茂的告知了,idea中如何新增依賴以及移除衝突依賴哦。
關於日誌
Scala 日誌操作
將日誌輸出至日誌檔案
關於打包
打成jar後打exe可執行程式。
注意選好Main class
再說一個很不錯的文件:
基本上就可以搞定jar變身exe了。nice
關於akka
說道akka的併發程式設計,在2.11的scala中,actor到akka這裡來了,同時呢,要知道akka的入口actorSystem的原理和操作。
如下我放至博文,需要的可以仔細研究一下。
值得一提的是,我在研讀spark核心原始碼時,看到sparkContext的初始化時,就有akka的actor訊息系統實現併發程式設計。
多囉嗦幾句,scala認為java的併發執行緒存在鎖爭用、併發效能低、容易引入死鎖。
有關於akka併發程式設計有一下博文:
akka使用
scala執行緒安全避免死鎖 akka實現
akka官方的一張圖
實際專案,請看我的下一篇博文。