使用Apache Spark比較Python和Scala for Data Science

Apache Spark是一個分布式計算框架势似,可以簡化和加速數(shù)據(jù)處理和分析工作流程,適用于處理大型數(shù)據(jù)集的數(shù)據(jù)科學(xué)家和工程師。它為原型設(shè)計提供統(tǒng)一的界面,并構(gòu)建生產(chǎn)質(zhì)量應(yīng)用程序永品,使其特別適合敏捷方法。我個人認(rèn)為Spark將不可避免地成為機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)事實上的大數(shù)據(jù)框架击纬。

盡管對Spark有不同看法鼎姐,但我們假設(shè)數(shù)據(jù)科學(xué)團(tuán)隊希望開始將其作為主要技術(shù)。編程語言的選擇通常是一個兩難選擇。我們應(yīng)該在Python或Scala中構(gòu)建我們的模型嗎炕桨?我們應(yīng)該使用Python筆記本或Scala進(jìn)行探索性分析嗎饭尝?

一個共同的理解是Python是科學(xué)語言,Scala是一種工程語言献宫,被視為Java的更好替代品钥平。雖然事實確實如此,但并非總是如此姊途。

由于這兩種語言的比較已經(jīng)在其他地方進(jìn)行了詳細(xì)的評估涉瘾,我想將這種比較限制在敏捷工作流中利用Apache Spark構(gòu)建數(shù)據(jù)產(chǎn)品的特定用例。

特別是捷兰,我可以確定此上下文中的數(shù)據(jù)科學(xué)編程語言應(yīng)提供的6個重要方面:

  1. 生產(chǎn)率

  2. 安全重構(gòu)

  3. Spark整合

  4. 開箱即用的機(jī)器學(xué)習(xí)/統(tǒng)計軟件包

  5. 文檔/社區(qū)

  6. 交互式探索性分析和內(nèi)置可視化工具

為什么只有Scala和Python立叛?

Apache Spark附帶了4個API:Scala,Java贡茅,Python和最近的R.我之所以只考慮“PyScala”秘蛇,是因為它們主要提供與其他2種語言相似的功能(Scala over Java和Python over R),在我看來友扰,整體得分更高彤叉。此外,R不是通用語言村怪,其API仍處于試驗階段秽浇。

1.生產(chǎn)力

盡管靠近底層的編碼總能產(chǎn)生最優(yōu)化的結(jié)果,但已知成熟優(yōu)化是所有邪惡的根源甚负。特別是在最初的MVP階段柬焕,我們希望用盡可能少的代碼行來實現(xiàn)高生產(chǎn)率,并且可能由智能IDE引導(dǎo)梭域。

Python是一種非常易于學(xué)習(xí)且高效的語言斑举,可以從第1天開始快速完成工作。由于Scala具有高級功能病涨,因此需要更多的思考和抽象富玷,但只要您熟悉它,您的工作效率就會提高將大大提升既穆。代碼簡潔性非呈昱常可比,兩者都可以非常簡潔幻工,具體取決于您在編碼方面的表現(xiàn)励两。閱讀Python更加明確,它逐步向您顯示代碼執(zhí)行的內(nèi)容以及每個變量的狀態(tài)囊颅。另一方面当悔,Scala將更多地關(guān)注描述您要實現(xiàn)的目標(biāo)傅瞻,最終結(jié)果隱藏了大部分實現(xiàn)細(xì)節(jié)和執(zhí)行順序。但要記住盲憎,強(qiáng)大的力量會帶來很大的責(zé)任 雖然模式匹配是提取變量的一種非承峤荆酷的方式,

在IDE方面焙畔,IntelliJPyCharm都是智能且高效的環(huán)境掸读。盡管如此,與腳本語言不同宏多,Scala可以利用類型和編譯時交叉引用儿惫,它們可以更自然地提供一些額外的功能,而且不會產(chǎn)生歧義伸但。僅舉幾例:在項目中按名稱查找類/方法并鏈接依賴項肾请,查找用法,基于類型兼容性的自動完成更胖,開發(fā)時錯誤或警告铛铁。

另一方面,所有這些編譯時功能都帶來了成本:IntelliJ却妨,sbt和所有相關(guān)工具都很慢并且內(nèi)存/ CPU消耗很大饵逐。如果為了在Scala中打開多個并行項目,分配了2GB的RAM彪标,那么您不應(yīng)該感到驚訝倍权。在這方面,Python更輕量級捞烟。

結(jié)論:這兩個得分都非常好薄声,我的建議是如果你正在開發(fā)簡單的直觀邏輯,那么Python可以大大地完成工作题画,如果你想做一些比在Scala中學(xué)習(xí)和編寫功能代碼更值得投資的事情默辨。

2.安全重構(gòu)

此要求主要是敏捷方法,我們希望在執(zhí)行數(shù)據(jù)探索時安全地更改代碼的要求苍息,并在每次迭代時對其進(jìn)行調(diào)整缩幸。通常,您首先使用相關(guān)測試編寫一些代碼竞思,并在測試之后立即執(zhí)行和API桌粉。每次我們執(zhí)行重構(gòu)時,我們都會面臨引入錯誤并默默打破先前邏輯的風(fēng)險衙四。

這兩種語言都必須要求測試(單元測試,集成測試患亿,基于屬性的測試等......)才能安全地重構(gòu)传蹈。Scala作為一種編譯語言具有更好的優(yōu)勢押逼,但我不打算論證編譯與腳本語言的優(yōu)缺點。所以惦界,我會跳過這個挑格,但至少對我來說,我可以從鍵入的代碼中看到一些有用的好處沾歪。

結(jié)論:Scala非常好漂彤,Python平均。

3. Spark集成

大部分時間和資源通常用于加載灾搏,清理挫望,轉(zhuǎn)換數(shù)據(jù)以及從中提取最豐富的信息。對于那個任務(wù)狂窑,什么比將域特定邏輯表達(dá)為函數(shù)組合更好媳板,而不是懶得執(zhí)行它?難怪大數(shù)據(jù)正在變得越來越有用泉哈。

你現(xiàn)在希望我說Scala做得更好蛉幸,因為它具有原生功能。實際上在這種情況下丛晦,Spark之間的差異很大奕纫,而不是編程語言。盡管Python不是100%全功能(你可以通過外部庫來實現(xiàn))烫沙,但它包含了確實具有功能性的Spark API匹层。

然后,單個映射或簡化函數(shù)的實現(xiàn)可以是有效的斧吐,但至少主要邏輯表示為對原始數(shù)據(jù)的轉(zhuǎn)換和操作的管道又固,并且執(zhí)行計劃由計算框架定義。

您仍然必須巧妙地使用不同的Spark API以使您的代碼可擴(kuò)展和優(yōu)化煤率,但這兩個案例的任務(wù)是相同的仰冠。如果我們考慮代碼執(zhí)行性能,那么我們都知道JVM編譯的代碼運(yùn)行速度比Python代碼快蝶糯,但Spark正在轉(zhuǎn)向與DataFrame類似的語言抽象洋只,這將優(yōu)化大部分工作,從而產(chǎn)生可比較的性能結(jié)果昼捍。

因此识虚,解決方案是“使用Spark”。由于這一點(并且獨立于功能性質(zhì))妒茬,Scala本身支持它担锤,特別是在執(zhí)行低級調(diào)優(yōu),優(yōu)化和調(diào)試時特別方便乍钻。如果您使用過Spark框架肛循,那么您很熟悉它的序列化異常铭腕。由于Python代碼在JVM中被包裝和執(zhí)行,因此您無法控制函數(shù)中包含的內(nèi)容多糠。此外累舷,最新的Spark版本中的一些新功能可能僅在Scala中可用,然后才能在Python中移植夹孔。

結(jié)論:Scala在工程方面更好被盈,相當(dāng)于Spark集成和功能。

4.開箱即用的機(jī)器學(xué)習(xí)/統(tǒng)計軟件包

當(dāng)你嫁給一種語言時搭伤,你就嫁給了整個家庭只怎。對于實現(xiàn)大多數(shù)標(biāo)準(zhǔn)程序和模型的開箱即用軟件包而言,Python還有更多的東西可以實現(xiàn)闷畸,這些程序和模型通吵⑴危可以在文獻(xiàn)中找到和/或在行業(yè)中廣泛采用。Scala仍然落伍佑菩,但可以從Java庫兼容性和社區(qū)直接在Spark上開發(fā)一些流行的機(jī)器學(xué)習(xí)算法(參見MLlib盾沫,H20 Sparkling WaterDeepLearning4j ......)中受益殿漠。關(guān)于MLlib的一點注意事項赴精,根據(jù)我的經(jīng)驗,它的實現(xiàn)有點hacky绞幌,并且由于私有字段和類的平庸設(shè)計和無意義限制而經(jīng)常難以修改或擴(kuò)展蕾哟。

誠然,關(guān)于Java兼容性莲蜘,我沒有看到任何Java框架與其今天提供的Python有著驚人的scikit-learn和相關(guān)庫谭确。另一方面,許多Python實現(xiàn)僅在本地工作(除非使用一些bootstrapping / bagging +模型集成技術(shù)票渠,請參閱 https://cornercases.wordpress.com/2013/10/23/example-python-machine-learning-algorithm -on-spark /)但是他們開箱即用的實現(xiàn)在分布式算法方面缺乏強(qiáng)大的可擴(kuò)展性逐哈。另一方面,Scala只提供了一些實現(xiàn)问顷,但已經(jīng)可擴(kuò)展且可以生產(chǎn)昂秃。

不過,不要忘記在小數(shù)據(jù)問題中可以減少許多大數(shù)據(jù)問題杜窄,特別是在精確的特征選擇肠骆,過濾和聚合之后。在某些情況下塞耕,將大型數(shù)據(jù)集壓縮到矢量空間可能是有意義的蚀腿,該空間可以完美地適應(yīng)內(nèi)存并利用Python中提供的豐富性和高級算法。

結(jié)論:這實際上取決于數(shù)據(jù)的大小扫外。每次它都適合內(nèi)存時首選Python唯咬,但請記住項目的要求是什么:它只是一個原型還是你想在生產(chǎn)系統(tǒng)中部署/維護(hù)的東西纱注?Python提供了一系列已經(jīng)實現(xiàn)的軟件包,可以滿足任何需求胆胰。Scala只提供基礎(chǔ)知識,但在“生產(chǎn)”的情況下刻获,這是一個更好的工程選擇蜀涨。

5.文件/社區(qū)

如果我們在社區(qū)大小方面比較兩種簡單語言(沒有它們的外部庫),那么Python屬于tier1而Scala就在tier2之后蝎毡,請參閱 http://readwrite.com/2010/12/10/ranking-programming-語言厚柳。實際上,這意味著他們在StackOverflow中都有足夠的教程和答案沐兵,涵蓋了大多數(shù)用例和操作方法别垮。

如果我們考慮機(jī)器學(xué)習(xí)和統(tǒng)計框架的文檔,Python數(shù)據(jù)科學(xué)社區(qū)就會更加成熟扎谎,事實上你可以找到很多關(guān)于如何使用大多數(shù)Python庫解決很多問題和冷卻分析的教程和示例碳想。

不幸的是,我們不能對Scala說同樣的話毁靶。ML和MLlib庫非常差胧奔,真正理解它們?nèi)绾喂ぷ鞯奈ㄒ环椒ㄊ情喿x代碼≡み海可能與我在GitHub上找到的其他一些開源庫有關(guān)龙填。

結(jié)論:

在軟件開發(fā)方面,它們都具有良好的可比性社區(qū)拐叉。當(dāng)我們考慮數(shù)據(jù)科學(xué)社區(qū)和酷數(shù)據(jù)科學(xué)項目時岩遗,Python很難被擊敗。

6.交互式探索性分析和內(nèi)置可視化工具

iPython是科學(xué)界發(fā)明的最偉大的工具之一凤瘦,一年前它對奧斯卡獲勝者毫無疑問宿礁。今天我們可以找到許多受iPython筆記本啟發(fā)的筆記本電腦實現(xiàn),適用于任何語言廷粒。iPython進(jìn)化的Jupyter支持不同的內(nèi)核窘拯,而iScala實際上是基于akka播放的寧靜服務(wù)重新實現(xiàn)它。如果您只考慮打開基于Web的筆記本并開始編寫代碼并與其進(jìn)行交互坝茎,我認(rèn)為它們非常相似涤姊。

如果我們考慮使用筆記本與Spark進(jìn)行交互,那么使用Spark Notebook(在Scala中)可能會更有用嗤放,因為它是專門為此目的而設(shè)計的思喊,它提供了一些工具來生成自定義火花上下文或停止當(dāng)前正在進(jìn)行的作業(yè),無需訪問Spark UI或從命令行運(yùn)行命令次酌。雖然有一個很好的功能恨课,但我認(rèn)為不會有很大的不同舆乔。

當(dāng)我們接受依賴注入時,痛苦就來了剂公,在這方面Scala是一個真正的噩夢希俩!作為一個已編譯的JVM語言,所有依賴項必須在類路徑中可用纲辽,并且每次jar更改或新路徑進(jìn)入路徑時都需要重新啟動內(nèi)核颜武。此外,由于某種原因使用依賴管理工具(如sbt)會產(chǎn)生大量流量拖吼,然后將所有依賴項打包到一個大小為數(shù)百MB的胖jar中鳞上,然后必須由執(zhí)行后端代碼的JVM加載。Python在這里做得更好吊档,因為所有內(nèi)容都是在運(yùn)行時指定的篙议,您可以簡單地導(dǎo)入代碼或庫,解釋器將自動為您解決它怠硼,而無需重新啟動內(nèi)核鬼贱。這一方面非常重要,尤其是在將IDE中的開發(fā)與筆記本中的探索分離時拒名,從源文件夾中調(diào)用已實現(xiàn)邏輯的API吩愧。我用TypeSafe和SparkNotebook的人提出了這個問題,希望能以更有效的方式以某種方式解決它增显。

內(nèi)置可視化:Spark Notebook包含一個非逞慵眩基本的內(nèi)置viz庫,一個簡單但可接受的WISP庫同云,以及很少有關(guān)于javascript技術(shù)的包裝糖权,如D3Rickshaw炸站。一般來說星澳,它可以渲染和包裝任何JavaScript庫,但非常友好也不直觀旱易。毫無疑問禁偎,Python在提供和選擇繪制和構(gòu)建交互式儀表板的酷炫和高級方法方面具有優(yōu)勢。

結(jié)論:Python獲勝阀坏,即使SparkNotebook做得很好如暖,Scala還不夠成熟。我們還沒有考慮最近的Apache Zeppelin忌堂,它提供了一些奇特的可視化功能盒至,并支持語言無關(guān)的筆記本概念,其中每個單元可以代表任何類型的代碼:Scala,Python枷遂,SQL ......并且專門設(shè)計用于與Spark集成樱衷。

最終判斷

我應(yīng)該使用Scala還是Python?答案是:兩者都是的酒唉!

嘗試兩者并嘗試測試自己哪種更適合您的特定用例矩桂。根據(jù)經(jīng)驗:Python更加面向分析,而Scala更加面向工程黔州,但它們都是構(gòu)建數(shù)據(jù)科學(xué)應(yīng)用程序的優(yōu)秀語言耍鬓。理想的情況是讓數(shù)據(jù)科學(xué)團(tuán)隊能夠?qū)@兩者充滿信心并在需要時進(jìn)行交換。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末流妻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笆制,更是在濱河造成了極大的恐慌绅这,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件在辆,死亡現(xiàn)場離奇詭異证薇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)别渔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進(jìn)店門竣付,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雷厂,“玉大人,你說我怎么就攤上這事箩张。” “怎么了窗市?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵先慷,是天一觀的道長。 經(jīng)常有香客問我咨察,道長论熙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任摄狱,我火速辦了婚禮脓诡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘媒役。我一直安慰自己祝谚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布刊愚。 她就那樣靜靜地躺著踊跟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上商玫,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天箕憾,我揣著相機(jī)與錄音,去河邊找鬼拳昌。 笑死袭异,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炬藤。 我是一名探鬼主播御铃,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沈矿!你這毒婦竟也來了上真?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤羹膳,失蹤者是張志新(化名)和其女友劉穎睡互,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陵像,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡就珠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了醒颖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妻怎。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泞歉,靈堂內(nèi)的尸體忽然破棺而出逼侦,到底是詐尸還是另有隱情,我是刑警寧澤疏日,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布偿洁,位于F島的核電站,受9級特大地震影響沟优,放射性物質(zhì)發(fā)生泄漏涕滋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一挠阁、第九天 我趴在偏房一處隱蔽的房頂上張望宾肺。 院中可真熱鬧,春花似錦侵俗、人聲如沸锨用。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽增拥。三九已至啄巧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掌栅,已是汗流浹背秩仆。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留猾封,地道東北人澄耍。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像晌缘,于是被迫代替她去往敵國和親齐莲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內(nèi)容