4月9日,中國人民大學信息資源管理學院副教授夏天在CIO時代APP微講座作了題為《大數(shù)據(jù)時代的編程語言》的主題分享,詳述大數(shù)據(jù)時代主流編程語言的不同特點,以及初學者如何選擇學習一門與大數(shù)據(jù)有關的編程語言的相關問題。
我們知道,編程語言是大數(shù)據(jù)分析處理的必備工具,但編程語言的種類和數(shù)量非常多。以個人所接觸過的編程語言為例,在過去二十年的時間中,先后學過的語言有Pascal、C語言、C++語言、Visual Basic、ASP、PHP、Java、Python、R語言、Scala等不下十種編程語言,其中Script、Python和Java語言用的較多。此外,還有Ruby、Ada等優(yōu)秀的語言。這么多編程語言在大數(shù)據(jù)處理分析方面常用的有哪些?這些大數(shù)據(jù)中常用的編程語言各有什么特點?不同專業(yè)背景和興趣愛好的人員如何選擇編程語言的利器來擁抱大數(shù)據(jù)的挖掘分析?
一、大數(shù)據(jù)時代數(shù)據(jù)分析處理常用的編程語言有哪些
為了回答這一問題,從YouTube、Quora和知乎三個重要的社交媒體為例,以編程語言和大數(shù)據(jù)作為檢索條件,探究有哪些發(fā)現(xiàn)。
YouTube檢索結果的第一頁,共有二十條記錄,在這二十條的記錄中,Python出現(xiàn)了8次,R出現(xiàn)了4次,Java出現(xiàn)了3次。我們知道,開源所使用的Hadoop和MapReduce主要是由Java語言編寫而成。因此,如果標題中未直接提到某個具體的編程語言,但又涉及了Hadoop、MapReduce,我們也可歸為Java,那么,Java總計出現(xiàn)了6次,除此之外,Scala和Ruby各出現(xiàn)了一次。
Quora的檢索結果中主要涉及了Python和R語言為主,也涉及了Java和Scala的相關討論,在big data話題下關于Python和R語言的爭論是比較熱門的討論內(nèi)容。
知乎的檢索結果主要涉及了Java、Python、Scala、R語言、C語言和C++語言,其中以Java和Python為主。
除了上述典型的三個社交媒體之外,還可考慮當前的大數(shù)據(jù)生態(tài)圈。當前的大數(shù)據(jù)生態(tài)圈主要以Hadoop/MapReduce、Spark和Storm為典型代表,而這三個框架無一例外,都是構建在JVM(Java Virtual Machine)——Java虛擬機上,從這個角度來看,Java語言和大數(shù)據(jù)的關聯(lián)最為密切。除此之外,Spark除了Java之外,還提供了Python、Scala和R語言的相關接口。
二、大數(shù)據(jù)領域四大編程語言的特點
綜合看來,目前大數(shù)據(jù)分析處理應用最為廣泛的編程語言主要有四種:Java、Python、Scala和R語言。
世界上有一個著名的編程語言排行榜,即TIOBE以反映編程語言的熱門程度。2017年3月的排行中,Java、Python、R語言和Scala分別占據(jù)了第一、第五、第十三和第三十的位置。上圖中反映出近十五年來,Java在絕大多數(shù)時間中都占據(jù)了排行榜的首位,足見其本身的流行度。
1.Java
正如前面所提到的,Java是目前編寫大數(shù)據(jù)的重要語言,我們用的Hadoop、Spark和Storm都是用Java語言編寫而成的,可見Java語言在大數(shù)據(jù)方面的重要作用。
Java最初由Sun公司的詹姆斯·高斯林開發(fā)出來,高斯林長期供職于Sun公司,但Sun公司在2009年被甲骨文收購,高斯林一直對甲骨文公司抱有不滿,并于2010年離開甲骨文加入谷歌,他在離開甲骨文時說:“我所說的都關乎細節(jié)與誠實,但吐露真相只會帶來更多的壞處”,“在Sun與甲骨文的并購會議上,到處是有關Sun和谷歌專利的爭吵。甲骨文律師的眼睛閃閃發(fā)光。”關于Java的故事雖然鋪滿了傳奇,比如那些不可思議的成功、失之交臂的良機、糾纏不清的官司,但Java本身卻成功地應用在網(wǎng)絡計算、移動等各個領域。歷史上從未有像Java這樣可以如此廣泛地被應用的語言和平臺。
Java語言如此成功與Java的特點是密切相關的,在Java之前最流行的編程語言是C語言,但C語言的指針處理對普通程序員而言簡直是夢魘,經(jīng)常會帶來內(nèi)層泄露問題。因此,高斯林發(fā)明Java的一個重要原因便是為了解決C語言的泄露問題和C++兼容C語法而造成的一些歷史遺留問題。Java提出了引用類型,取消了C語言中特殊的指針語法,并通過垃圾自動回收的機制,自動回收不再使用的對象內(nèi)存。程序員只需創(chuàng)建對象,無需關心如何回收對象,這便使得程序員的犯錯率大大降低,開發(fā)效率也大大提升。同時,Java還提出了中間語言和虛擬機的概念,Java程序會先編譯成叫字節(jié)碼的中間語言,再由運行在各操作系統(tǒng)上的Java虛擬機軟件(JVM),在運行時解釋和執(zhí)行。這樣做的好處是實現(xiàn)了當年Java的口號:一次編寫、到處運行,使得企業(yè)可以自由選擇操作系統(tǒng)和服務器設備,保護了企業(yè)的投資。
我們直覺上認為,Java編寫的代碼需要編譯為字節(jié)碼,再由虛擬機來解釋執(zhí)行,運行速度應該慢于直接編譯為機器碼的語言,如C語言。但人們對Java虛擬機做了大量的優(yōu)化,使得普通程序員編寫的Java程序遠快于普通程序員編寫的C語言程序,不同水平的Java程序員也能較好的進行團隊協(xié)作,開發(fā)大型項目,變相降低了企業(yè)的人力成本。
Java具有跨平臺特性和開放特性,編寫效率相對較高,它屬于強類型的靜態(tài)語言,其本身結構非常方便大型項目的組織管理和模塊劃分。因此,畢業(yè)于美國斯坦福大學的Hadoop之父DougCutting在編寫Hadoop時選擇了Java語言,這并非偶然。
Java語言的特點人們比較認可的是:簡單性、面向?qū)ο?、分布式、健壯性、多線程、安全性、可移植性、動態(tài)性等特點,當然,其中的簡單、多線程是相對于當時的C語言、C++而言的??傊?,Java構成了當前企業(yè)大數(shù)據(jù)計算的基石。
2.Python
1989年的圣誕節(jié)期間,在荷蘭的阿姆斯特丹,年輕的Guidovan Rossum為了打發(fā)圣誕節(jié)的無聊,決定開發(fā)一個新的腳本解釋程序,由于他非常喜歡英國六人喜劇團體Monty Python,因此以Python作為腳本名稱。
Python由ABC語言繼承而來,非常適合非程序員來學習使用,普通人員在學習Python時入門非常容易,剛剛提到Java是一門簡單的語言,Python則是“更加簡單”的語言。我們在開始學習Java時,需要配置環(huán)境變量、安裝基礎開發(fā)環(huán)境、編譯運行等,這些基礎工作使得很多人抓狂,甚至成功將很多人嚇跑了。Python要簡單得多,下載安裝之后,在命令行直接輸入Python,便可打開一個解釋器,每執(zhí)行一行代碼能立即看到輸出結果。因此,初學者非常樂意將Python當作一個強大的科學計算器來使用,體驗Python的強大功能。
Python遵循了優(yōu)雅、明確、簡單的設計原則,一件事情會有很多種方法,其中會有相對較好的一種。Python開發(fā)者的哲學是用一種方法,最好只用一種方法做一件事情,如果有多種選擇,Python開發(fā)者會拒絕花哨的語法,而是選擇明確的、沒有歧義的語法。
Python強制使用空格作為邏輯代碼塊的隸屬關系控制,強制程序員養(yǎng)成良好的編程習慣。Python的解釋器中會輸出Python推薦的編寫風格和準則,例如優(yōu)美勝于丑陋,明了勝于晦澀。在Python顯示器中輸入importthis,便可看到這一系列準則的英文。
經(jīng)過二十多年的發(fā)展,Python已變得非常流行。從早期的各類系統(tǒng)管理任務和web編程,到后來的科學計算和數(shù)據(jù)分析,Python的應用都比較多。Python的簡潔、易讀和可擴展性使得用Python做科學計算的研究機構日益增多,如卡內(nèi)基梅隆大學的編程基礎、MIT的計算機科學基編程導論都采用了Python來教授這些課程。此外,眾多開源的科學計算軟件包也都提供了Python調(diào)用接口,如著名的圖形庫(OpenCV)、三維可視化庫(VTK),在科學計算和數(shù)據(jù)分析方面也形成了較為統(tǒng)一的經(jīng)典擴展庫,如用于快速數(shù)組處理的NumPy、數(shù)值運算專用的SciPy、圖形繪制的MatplotLib、金融處理方面的Pandas。同時,還有大量的經(jīng)典圖書采用了Python語言來講解數(shù)據(jù)挖掘方面的相關理論,如集體智慧編程、社交媒體的數(shù)據(jù)挖掘與分析等等。
因此,Python的特點可以總結為簡單、優(yōu)雅、易于擴展、有豐富的科學計算和數(shù)據(jù)分析擴展庫,非常適合數(shù)據(jù)科學家來學習使用。
3.R語言
R語言本質(zhì)上是一款集統(tǒng)計分析和可視化于一體的免費的可跨平臺運行的統(tǒng)計軟件。由新西蘭奧克蘭大學的Robert Gentleman和RossIhaka二人在九十年代初期共同發(fā)明,當時兩個人教授一門初等的統(tǒng)計課程,為方便授課開發(fā)了這一語言,由于兩個人的名字均以R開頭,因此被稱為R語言。
R語言可以看作是大名鼎鼎的貝爾實驗室所開發(fā)的S語言的一種實現(xiàn)。1975年,貝爾實驗室的統(tǒng)計研究部使用了一套文檔齊全的擴充庫來做統(tǒng)計研究,我們稱其為SCS。但SCS在做統(tǒng)計分析時需要大量的編程,有人認為這樣太麻煩,于是貝爾實驗室又開發(fā)了一套完整的高級語言系統(tǒng),即S語言,用于交互。1993年,S語言的許可證被MathSoft公司買斷了,引起了人們的擔憂,而開源的R語言引起了人們的關注。1997年,R語言正式成為GNU項目,大量的優(yōu)秀統(tǒng)計學家加入了R語言的開發(fā)行列。到今天,這一場開源和商業(yè)、開放和封閉之爭已塵埃落定,R語言已成為當今最為流行的統(tǒng)計分析工具之一。
和Python類似,R語言的使用也很簡單,直接打開R的交互環(huán)境,輸入demo,便可以看到其中的一些例子。因此,初學者可以很快地獲得直觀的感受,增加學習的樂趣,對學習統(tǒng)計知識非常有幫助。
從R語言的發(fā)展歷史來看,主要是為統(tǒng)計學家解決數(shù)據(jù)分析問題而開發(fā)的。R的特點是尤其擅長于數(shù)據(jù)的統(tǒng)計分析。R語言算法幾乎覆蓋了整個統(tǒng)計領域的前沿算法,重復性的工作借助R語言強大的分析能力和排版能力,利用Sweave能得到很好的解決。R本身屬于統(tǒng)計編程類語言,受到其算法架構的通用性和速度、性能等方面的影響,最開始的設計完全是基于單線程和內(nèi)存計算完成。因此,在處理大規(guī)模數(shù)據(jù)時顯得力不從心,好在R有一些優(yōu)秀的擴展,能在一定程度上解決這些問題。如SparkR、RHadoop等等。
4.Scala語言
我們知道,偉大的Java促進了今日信息技術的輝煌,Java支撐了大量的企業(yè)級關鍵應用,如web站點、手機應用等等。但人們一直期待Java的重大改進和更新?lián)Q代,使其吸收其他語言的長處,進一步提升生產(chǎn)效率。而Scala不僅在“更好的Java”方面做得非常成功,而且在并發(fā)編程、大數(shù)據(jù)處理、科學計算方面都取得了不錯的效果。
Scala由瑞士的聯(lián)邦理工學院Martin Odersky在2003年開始設計,在此之前,他已經(jīng)因?qū)ava的優(yōu)化而聞名于世,Scala是其又一成名之作。正如其名,Scala本身是一門可擴展的語言,其中有靜態(tài)運行、面向?qū)ο缶幊?、函?shù)式編程、類型推導、高階函數(shù)等眾多特性。Scala語言非常經(jīng)典,相同的功能用Scala實現(xiàn),代碼量能達到Java的百分之二十左右。Scala不僅可以做到更好的Java,而且在數(shù)據(jù)統(tǒng)計分析方面,原先Python和R語言獨具的一些統(tǒng)計分析模塊,已經(jīng)有越來越多的Scala實現(xiàn),例如Breeze、Spark data frame、Zeppelin。我們知道以前的數(shù)據(jù)分析書籍大多由Python語言寫成,現(xiàn)在也有許多用Scala進行數(shù)據(jù)分析和機器學習的書籍,如Scala Data Analysis Cookbook、Scala for Machine Learning。
Scala可以無縫銜接原有的Java庫,充分地利用現(xiàn)有的Java資源,在大數(shù)據(jù)并行分析處理方面更是獨具優(yōu)勢。因此,很多大數(shù)據(jù)平臺都選擇Scala作為首要的實現(xiàn)語言和API接口語言。
個人認為,Scala最主要的特點是非常靈活,以至于初學者的學習曲線比較陡峭,但Scala很好地將Java的面向?qū)ο缶幊谭椒ㄅcHaskell函數(shù)式編程思想揉在一起,其中體現(xiàn)的現(xiàn)代化編程思想值得程序設計人員深入的學習和體會。
這四種編程語言各有各的優(yōu)點,但有人的地方便有爭論,這里的爭論焦點主要集中于R和Python間的選擇問題。其實,通過這兩種語言的官網(wǎng)介紹,便可以看出他們的定位并不完全一致,Python是一種通用的編程語言,除數(shù)據(jù)分析外在很多領域都有廣泛的應用,R的定位是“用于統(tǒng)計計算的免費軟件環(huán)境”。
三、初學者如何選擇大數(shù)據(jù)編程語言
工欲善其事必先利其器,對于奮戰(zhàn)在大數(shù)據(jù)處理和分析前沿的人員而言,手中應有一把使用自如的快刀,當面對上述四種各有特色的編程語言應如何選擇?
在Quora上,有人提到,對于數(shù)據(jù)工程推薦使用Java和Scala,對于數(shù)據(jù)科學推薦使用Python和R語言,個人覺得很有道理。如果你是一個統(tǒng)計學家,并沒有太多的計算機科學背景,R應該是一個很不錯的選擇;如果接受過較為系統(tǒng)的程序設計訓練,又想從事數(shù)據(jù)分析方面的工作,Python應該是不錯的選擇;如果我們要做大數(shù)據(jù)產(chǎn)品、大數(shù)據(jù)具體項目,或者想深入了解現(xiàn)在大數(shù)據(jù)框架底層的運行機制,那學習Java是必不可少的基本要求;對于Scala語言,如果你是一個熟練的Java工程師,厭倦了Java的冗余繁瑣,向往美好的函數(shù)式編程、向往Python的簡潔優(yōu)雅、向往R語言的強大統(tǒng)計功能,可以選擇Scala。Scala還有一個額外的好處,用Scala寫的程序代碼初級程序員很難看懂,也不敢隨意修改,便不用擔心在團隊協(xié)作時精心編寫的代碼被一些初級程序員改錯。
當然,個人認為,編程語言并沒有高低貴賤和優(yōu)劣之分,各有各的優(yōu)點,如果你有興趣和能力,不妨將各種語言都實踐一遍,尤其是側重于大數(shù)據(jù)工程的技術人員,在學好一門重量級的語言,如Java語言,與此同時,掌握一門Python或R語言對于開拓自己的視野、學習數(shù)據(jù)分析的理論、閱讀相關的書籍都是大有裨益的。