2015年12月19日 星期六

車聯網的即時服務架構-以Uber為例

大數據的架構是很有趣的,因為牽涉既有傳統的資訊設施,也需融合新擁有的數據儲存與分析設施,而且在不同的使用情境下,架構也不相同。

因此想切入大數據的公司,常常面臨到的問題除了「不知要如何開始」之外,就是「要如何建構可以容易擴展的平台」,以及在最節省資源的情況下,如何給予使用者最佳的服務。而筆者所協助的公司,也常常面臨到技術太多無從選擇,導致不知道如何將新技術配置到架構上。因此大部分的大數據專案常常因為「想做的題目太多,不知如何做起」、「技術太多種,不知從何用起」導致上層也無法承擔與拿定主意,最後不是中途喊卡,就是專案失敗。


近幾年車聯網(Internet of Vehicles)的議題開始被討論,而筆者也正在觀察這種不同聯網的技術架構,因此就以最近由優步(Uber)的首席系統架構師Matt Ranney發表的文章中,它們透過開放原始碼建構的即時服務平台Disco,從中整理一些車聯網建構即時服務系統的方式。

首先我們可以從Uber的現有狀態來觀察,甚麼樣的需求,會需要建置這樣的服務平台? 從Uber的全球服務來看,他們每秒必須面臨一百萬筆Uber車子的Geospatial的索引,以及數千個節點的連接。

Uber整理了幾個他們從2009年開始至今約6年間採用的技術包含「Node.jsPythonJavaGoNative applications on iOS and AndroidRedisPostgresMySQLRiakTwitter's Twemproxy for RedisGoogle's S2 Geometry LibraryringpopTChannelThrift筆者針對這些技術整理技術概要介紹如下

  1. Node.js
    Node.js從2009年誕生之今,也是約6年期間。主要流行的原因是將Java Script帶到後端(Back end)應用,以前專門用JS寫前端的人,只要學Node.js就可以開始寫後端(Back end),所以這些人就變成所謂的全端(Full Stack)。

    Node.js的底層是採用Google V8的引擎,以C++撰寫而成,特性在於撰寫即時的網站服務(Real-Time Web Service),Node.js有所謂的異步I/O模型,一般服務器處理的方式採用同步I/O的方式,如:我們丟一個檔案,服務器就把他印出來,是一個直觀的做法。但在互聯網的環境,大量的請求就會把CPU資源吃光。而異步I/O的方式就是遇到I/O請求就先往後台丟,讓CPU能先處理任務,這樣單一CPU就可以處理多個問題,所以Node.js的異步I/O模型又稱非阻塞I/O。Uber採用Node.js來處理API、訂單的各種即時服務。
  2. Python
    正如其名蟒蛇(Python)一樣,有龐大又好用的套件支持,對於一些想要快速進行服務雛形,都可以透過Python很快的去實作。Python從1991年誕生之今,以優雅、明確、簡單的概念讓開發者可以很快的把各種服務想法快速的實現,因此Uber就是利用Python這種方便「整合」的特性,各種服務機制透過Python來撰寫。
  3. Java
    這個語言資訊相關科系的同學是再熟悉不過了,Java從1995年誕生後至今都仍然很活躍的語言,近年最知名的應用就是Android作業系統,因為Java的語法嚴謹、普遍,因此有些開源軟體會採用Java作為主要開發語言,則虛擬機採用C/C++來做撰寫。Uber則是透過Java與前面的Python整合一些地理資訊上的應用。
  4. Go
    這個語言與Node.js都是在2009年出現,這個語言非常有野心,據說要取代C/C++,當然筆者認為短時間不太可能出現這樣的情形。不過Go因為有了Google的支持,使得在語言發展上較其他語言有更大的優勢。不過筆者觀察的特色在於Go處理需要擴展性(Scalability)與平行性(Concurrency),有很大的優勢,因此Uber把原本要給C/C++要做的事情,部分交給了Go來做處理,藉此提高系統的運作效率。
  5. Native applications on iOS and Android
    因為Uber的服務講究的是好的性能與效率,因此開發了原生的iOS與Android APP。誠如前面提到的Android是採用Java撰寫,而iOS早期為Objective-C所編輯,從2014年開始改Swift語言做開發。
  6. Redis
    這個資料庫也是在2009年出現,屬於NoSQL的一種,採用鍵值(Key–value)的方式儲存資料,它最大的特性在於資料都是儲存於記憶體上,便於使用與高吞吐的情境上,屬於CAP理論中的CP,也就是一致性(Consistent)與分隔容忍性(Partition Tolerance)。Uber採用它做暫存的動作,讓服務能處在低延遲高效率的狀態上。Uber有不少的應用都是採用基於Twemproxy的Redis,使服務能保持不間斷。
  7. PostgreSQLMySQL
    PostgreSQL與MySQL一樣都是傳統關聯式資料庫(RDBMS),跟Java一樣兩個都是1995年誕生,目前MySQL一直在市場上有一定程度的擁護者,不過近幾年因為MySQL商業化後,當初開發MySQL的開發者轉至MariaDB,因此稍微式微一些。反觀PostgreSQL的使用者仍保持開源的方式持續成長,筆者認為它與MySQL最大的不同在於對於地理資訊的處理有強大的功能支持,因此除了日常服務,PostgreSQL更能處理有關地理資訊的資料儲存。不過Uber看起來是把PostgreSQL作為服務一開始的資料庫,筆者認為應該就是看到PostgreSQL的特性,而MySQL則是來當作一般日常服務的資料儲存。
  8. Riak
    幾年前看到Riak的時候,是因為正在了解Hadoop的架構,Riak較Hadoop更為年輕,是在 2009年誕生。Riak是採用鍵值(Key–value)的方式儲存資料,在CAP理論中屬於AP,也就是可用性(Availability)與分隔容忍性(Partition Tolerance),也就特性是以確保寫入與讀出為主。不過Riak跟Cassandra一樣沒有Master/Slave,因此資料在吞吐上主機的壓力較小。Uber將Riak應用在調度系統上,看起來相當合理,因為即時的調度在資料輸入與輸出上需要不斷的吞吐。
  9. Twitter's Twemproxy for Redis
    Twemproxy是Twitter所推出的開放原始碼,是Twitter貢獻前面提到的Redis的架構,以提供更高效能的服務。Twitter採用龐大的Redis集群提供時間軸的訊息顯示,而Twemproxy最大的特色在於當一個Node失效的時候,自動卸載與自動重新連接,因此Uber採用它來做低延遲的服務應用。
  10. Google's S2 Geometry Library
    過去的Uber只能看到Uber的供應量,但其實無法完全掌握汽車與客戶間的距離作最佳化的處理,因此為了強化匹配的效率,Uber要將每個區塊變成一個id,Uber透過S2切成一個個細胞(cell),讓所有的乘客可以因此降低等待時間,因此透過S2的覆蓋函數,Uber不再只是尋找可以載乘客的司機,更能找到可以「順路」載乘客的司機。
  11. Ringpop
    Ringpop是Uber自己開發的模組,是給Node.js使用。它是一個採用Gossip協定,降低服務的出錯機率,在Gossip協定中一旦節點都獲得認證, 它們就可以快速地進行查詢與散播訊息,Gossip以前最常出現在P2P的服務當中。Uber就是把Gossip結合可擴充可傳導的弱一致性行程群組成員協定(SWIM)放到Node.js當中。
  12. TChannel
    TChannel透過Ringpop的實現,Uber就建立了屬於自己遠端調用程式(PRC)機制,它們稱為TChannel,使得每一個請求與回應都能獨立與安全的運作,因此TChannel在搭配Redis下,通訊效率比HTTP快,Uber正在改變早期採用HTTP與Json通信模式,往TChannel的Thrift通訊方式作發展。
  13. Thrift
    Thrift最早在2007年前,是被Facebook開發,且被用來處理系統間的RPC服務,最大的特色在於支援相當多的語言,快速實現RPC的服務。

Uber服務平台處理的工作,就是協助每一位駕駛與消費者的能夠緊密連接,這件事情的挑戰在於如何在即時的狀態下去做資訊動態的連接,像是一位消費者正準備要找車搭,在自己的手機APP上,系統會顯示附近的車輛,這些過程都是即時呈現,所以服務平台必須能夠快速捕捉駕駛的位置,並回傳到手機APP上,提供準備找車的消費者查詢。

這在日常的時段,做匹配(Matching)的工作還可以應付,當在過新年的時候,才是Uber面臨的巨大挑戰,因為跨年後想要搭車的消費者是瞬間暴增,就像是以前SMS時代,大家跨年之後,想傳簡訊給身邊的朋友祝福,卻發現簡訊發不出去,發生系統滿載的問題,Uber服務平台的挑戰亦同。

大家都知道Uber的服務平台,主要以iOS與Android為主,而真正在調度的機制,幾乎是採用Node.js完成,因為Node.js擁有Java script的特性,資料吞吐上能保有較佳的彈性,因此除了iOS與Android之外,資料介接則是採用Node.js語言建構。以下是其他包含的機制技術:

地圖(Maps/ETA): 最短抵達時間(Estimated Time of Arrival簡稱ETA)該機制被使用來估計抵達的時間,除了可以顯示街道地圖,也可以呈現估計時間,採用了Python、C++與Java語言,採用Python是為了要整合機制,採用C++與Java則考慮提升執行效率。

服務(Service):該服務主要用於提供商業物流服務,大部分是採用Python進行撰寫,因為Python具備開發彈性,並同時採用Microservice的方法。

資料庫(Database):早期採用PostgresSQL,後來採用Redis主要是與Twemproxy結合。也有採用MySQL於線上服務網站。另外還有一些調度服務是採用Riak進行儲存。

配套服務:配套的系統服務,包含收集排名、信件通知、更新資料庫、付款時程......等,都是採用Python進行撰寫,當然還是考量Python的語言可讀性高,且具備開發彈性。

金流:Uber的金流介接都與目前的金流公司合作。


面對Uber接下來的急速增長的客戶數量挑戰,Uber提出新系統的建構想法,像是他們增加了更詳細的資訊交換內容,包含供給端與消費端,供給端提供座位數、車型、小孩座位,消費端則提供需求座位數,結合地理資訊(Geo),做這兩端的調度最佳化(Dispatch Optimization)。

筆者整理Uber的幾個服務項目的新建構思維,如下:
  1. 供給與需求雙方的資訊媒合,消費端的需求可以被快速媒合。
  2. 當消費端出現,服務平台能夠能快速找出最靠近的候選車輛。
  3. 透過較新的技術達到服務的可用性,確保服務不斷線
  4. 每一個服務都有具備重複詢問的功能,確保每一個訂單都能運作。
  5. 從一個可以提供載客的服務,走到可以提供順路載客的服務。
  6. 利用新技術達到減少空載、減少等待、整體到達時間(ETA)最短的服務


基本上現在許多資訊服務都是各種技術混用,因此筆者常需要涉獵各種不同的大數據運行架構,本篇主要針對Uber的技術做了一些整理,希望能提供給需要了解各種技術架構整合的讀者有初步的了解,如果讀者有興趣,也歡迎自行到下面參考資料中作進一步的閱讀。


其他資料參考:

2015年11月13日 星期五

R語言從「初學」到「進階」到「跨界」的32本書籍推薦


R語言一直是數據分析界的熱門語言,也因此R語言相關的書籍也相當的多。筆者在學R的過程也看過許多R語言的書籍,筆者也收集相當多的R書籍,但大多參差不齊,有些寫得很好,有些則寫的較為艱澀,最近看到網路上大家在討論由淺入深的學習參考書籍,因此筆者也想做個小整理,包括初級、中級、高級,以及相關領域,內容如下:

[初級]

適合完全不懂R看的書,前三本都是值得參考。
[中級]

適合對R有初步認識的讀者,前三本都是值得參考。
[高級]

想挑戰R的技術的讀者,三本都非常推薦。
  • Advanced R
    • 這本書提了很多R進階的撰寫技巧,作者目前是RStudio首席資料科學家。
  • Statistical Computing in C++ and R
    • 畢竟R還是高階語言,許多效率的改善還是要去參考C++跟R整合的部分。
  • R Packages
    • 這本書是介紹如何撰寫R Packages的技巧,以及R套件與R核心整合的內容,適合非常熟悉R並且想開發R套件的讀者,與Advanced R是同一個作者。
[資料視覺化]
[網站應用]
[統計學]
[計量經濟學、金融]


[資料探勘]
[機器學習]

[資料科學]
[空間資料]
[市場研究]


其他領域結合R的書也歡迎推薦。

2015年10月16日 星期五

透過Python與Spark做氣象大數據分析

In this project, we applied Spark in weather data analysis. This application includes uploading data to Object Storage, establishing RDD, making data filtered, calculating the average of data, printing results and sorting. Based on the uses mentioned above, Bluemix Spark includes many advantages. It can start to make data analysis within one minute. Users only need to push one to two button to make resource extension. (You can choose the memory and the number of hosts)  It is convenient for users to make data storage and access and they do not have to consider infrastructure problem.

Spark helps us enter data analysis environment  quickly, so that data scientists can create more values for the data.  

還記得幾年前接觸Hadoop的時候,碰到運算分析的問題,都要特別的去考量分散運算的問題,像是有些需要做迭代的演算法(如:基因演算法),作法上因為需要一直大量做Map Reduce,所以都會有效能的問題,因此最後大部分的做法都回到In-Memory上做計算。



一直到去年2014年11月Databricks團隊透過 Apache Spark國際資料排序基準競賽(Sort Benchmark Competition)(新聞),以不到30分鐘的時間排序高達100 TB的資料量,打破Hadoop的72分鐘,將分散式運算(Distributed Computing)產業的應用領域帶到另一個高峰。Spark源自於加州柏克萊大學的AMPLab,這個實驗室投入各項數據分析的應用已經很多年,像是資料探勘、機器學習、資料庫等等,其中一位成員Matei為Spark主要發展者,目前已經是麻省理工學院的助理教授,同時也是Databricks的技術長。

Spark目前依存在Hadoop Ecosystem裡面,像是Hortonworks (HDP2.2)開始就有包含Spark,而普遍的做法就是搭配Hadoop的Hbase或HDFS使用,搭配的語言包含Java、Scala、Python、R (1.4版本開始支援),這些都是目前資料科學家常使用的語言。

今天的主題並不是主要介紹Spark,而是於2015年8月剛IBM推出的Apache Spark for Bluemix。我們都知道資料科學家需要專注於分析上,因此在基礎設施上需要一個便利的環境讓資料科學家能夠使用。(筆者按:其他雲端服務亦有類似功能,但仍須安裝與設定,包含:AzureAWS)



而Bluxmix上的Spark就有這樣的潛力,他們把Jupyter Notebooks直接整合在Spark上面,讓資料科學家可以直接進行計算與分析,在儲存方面則採用Swift Object Storage的檔案儲存方式,方便做存取之用。如下圖所示,資料科學家只需要在Jupyter Notebooks上面直接下指令,就可以與資料進行互動,完全不需要擔心基礎設施的問題。

筆者接下來就進行簡單的實作透過Python語言體驗一下Apache Spark for Bluemix

首先我們必須申請Bluemix的帳號,登入後進入下面網址:
https://console.ng.bluemix.net/catalog/apache-spark-starter/

步驟一、
接著就會看到下圖,接下來選擇右邊的「Apache Spark」,並點選Create進行Deploy。

步驟二、

不到一分鐘,就會看到已經佈署好的Spark,同時他也把Object Storage也整合完成,同時我們也可在Instances與Memory Quota上面直接調整我們想要的Spark分散主機數量,以及每一台的記憶體多寡。最後我們就可以透過上方Routes旁的網址,直接進入Spark的畫面。
步驟三、
進入後,直接點選右邊的Launch即可登入。


步驟四、
進入之後會出現Jupyter Notebooks需要做帳號密碼的輸入,我們可以回到前面步驟二的畫面中找到下圖所示的密碼資訊,它放在Environment Variables裡面的app_pw裡面。

步驟五、
接著我們就可以直接進入Jupyter Notebooks直接做分析! 
首先我們到國際氣候數據網站(National Climatic Data website)進行天氣資料下載,如下圖所示。





步驟六、
使用ZIP將檔案進行解壓縮,得到2015.csv檔案,因為檔案內容相當大,透過Excel打開會很久,筆者這邊是使用Sublime Text把檔案打開,在第一行加入「STATION, DATE, METRIC, VALUE, C5, C6, C7, C8」,如下圖所示:

步驟七、
回到步驟三的頁面,點選右下角的Manage Files,我們要把csv檔案上傳到Bluemix Object Storage,如下圖紅框所示:

步驟八、
Object Storage的密碼與Jupyter Notebooks登入密碼相同,我們輸入後就到右邊「+」的符號進行新增資料,並填入ClimateDataForTutorial,建立內容,完成後就會如下圖這樣呈現:

步驟九、
點選我們建立的ClimateDataForTutorial,上傳資料集,如下圖所示:
步驟十、
從這個階段開始,我們將開始進行資料分析,下面操作程式碼都已內建在Jupyter Notebooks上面,所以讀者只要照著操作,基本上不會有太大的問題,如果需要筆者的程式碼,請參考筆者GitHub,如果您想自己安裝Spark,也可參考這裡

首先我們先設定資料路徑,Spark的資料結構名為彈性分佈式數據集(Resilient Distributed Dataset 簡稱RDD),Spark透過RDD將資料進行分區儲存與處理,因此我們透過sc.textFile這個指令就可以建立RDD,接著在輸入weather.count()就可以查看整個資料集筆數,如下圖所示,2015.csv有超過兩千萬筆資料。

步驟十一、
接下來透過Lambda指令建立一個匿名函數(Anonymous functions),將line : line.split(",")結果進行回傳,將資料改成行並以逗號做分割,透過map產生一個新的RDD,叫做weatherParse,如下圖所示:
步驟十二、
透過filter抓取降雨量(PRCP)的資料,獲得weatherPrecp資料,接著將資料做個整理,一樣透過map加上Lambda將資料轉換產生新的RDD為weatherPrecpCountByKey如下圖所示:
步驟十三、
接著透過reduceByKey,將把個Key的相同元素做一個reduce的動作,譬如說我們RDD資料有(A,2)、(B,2)、(A,5),我們想把它做x + y的動作,那reduceByKey就會產生(A,7)、(B,2)的結果。同樣地用到這裡,是希望將前面整理好的氣象站降雨量資料,做某一些特定動作,在這裡我們一樣做加總,並產生新的RDD為weatherPrecpAddByKey如下圖所示:


步驟十三、
接著我們將資料做平均的計算,一樣透過map搭配計算公式的方式取得每個氣象站的平均值,產生名為weatherAverages的RDD。

步驟十四、
到這一步基本上都已取得各氣象站的平均降雨量,接著我們只要印出來即可。透過下面指令的動作,我們可以獲得前10筆的資料,結果如下圖所示:
for pair in weatherAverages.top(10):
    print "Station %s had average precipitations of %f" % (pair[0],pair[1])

步驟十五、
我們再透過下面指令做降冪排序的動作,由大排到小,結果如圖所示:
for pair in weatherAverages.map(lambda (x,y):  (y,x)).top(10):
    print "Station %s had average precipitations of %f" % (pair[1],pair[0])

完成了簡單的資料讀取與處理。


透過上面實作,我們完成了幾個部分,包含上傳資料到Object Storage、建立RDD資料、將資料做過濾、將資料進行平均的計算、以及印出結果與排序。綜合以上使用,筆者整理Bluemix Spark特色如下:
  1. 不到1分鐘就可以開始進行資料科學運算
  2. 只有1~2個按鈕就可以資源擴展 (可自選記憶體與主機數量)
  3. 便利的資料儲存與取用
  4. 不用顧慮基礎設施問題



2015年9月23日 星期三

60本免費的資料科學書籍



資料科學(Data Science)這個名詞是近幾年非常流行的概念,它其實講的是跨領域(Interdisciplinary)的組成,這些學科包含如下:
  1. 數學 (Mathematics)
  2. 統計 (Statistics)
  3. 化學計量學 (Chemometrics)
  4. 資訊科學 (Information Science)
  5. 電腦科學 (Computer Science)
  6. 機率學 (Probability Theory)
  7. 機器學習 (Machine Learning)
  8. 統計學習 (Statistical Learning)
  9. 資料探勘 (Data Mining)
  10. 資料庫 (Database)
  11. 資料工程 (Data Engineering)
  12. 模式識別 (Pattern Recognition)
  13. 視覺化 (Visualization)
  14. 預測分析 (Predictive Analytics)
  15. 不確定性建模 (Uncertainty Modeling)
  16. 資料倉儲 (Data Warehousing)
  17. 資料壓縮 (Data Compression)、
  18. 電腦程式 (Computer Programming)
  19. 人工智慧 (Artificial Intelligence)、
  20. 高效能運算 (High Performance Computing)
資料科學領域知識包羅萬象,其中更包含特定領域知識的資料挖掘手法,因此資料科學在多個複雜學科中應運而生,既然是資料科學實驗室,就不能不推薦國外的資料科學相關書籍,以下為國外收集的免費資料科學相關書籍,不完全是新書,但希望可以協助讀者能更深入的了解這塊領域,其中幾個學科是必須知道的,像是R、Python這兩個資料科學主流語言,以及人工智慧、機器學習、資料探勘、資料庫等理論與工具書,都是進入資料科學領域的必學知識。


關於資料科學

關於大數據


關於資料分析


關於資料科學團隊


關於分散式分析

關於Python


關於R

關於SQL

關於資料探勘與機器學習


關於統計與統計學習


關於資料視覺化


關於資料科學工具

參考資料:



2015年8月23日 星期日

「2015 台灣資料科學愛好者年會」精彩資料整理

2015 台灣資料科學愛好者年會」為一年一度的台灣資料科學盛事,參加人數超過千人,這次的活動從2014年的兩天,加長為四天的活動,並且同軌進行,包含「R資料分析上手課程」、「g0v 零時政府黑客松」、「DSP 資料開竅 ▪ 企業論壇」、「資料新聞實戰營」、「Hadoop/Spark 資料科學快速體驗營」、「地圖資料視覺化課程」,以及最精采的「年會主議程」,內容相當豐富也很精采。



以下為筆者所收集的資料科學年會相關活動資料內容

新聞:
  1. 阿里巴巴副總裁車品覺:資料是一種信仰!
  2. 中華電信如何培訓資料科學人才,先讓IT學會商業心法做起
  3. 大資料分析苦手不用怕,資料科學愛好者年會帶你Hadoop做中學
  4. 臺灣資料科學愛好者年會擴大舉辦,阿里巴巴和IBM華生團隊首席帶頭開講
  5. 【活動快訊】資料科學家們 attention!「2015 台灣資料科學愛好者年會」來啦
  6. 2015 台湾资料科学爱好者年会 开始售票!
  7. [展望2015]25%企業今年將導大資料,資料科學人才更搶手
  8. 阿里巴巴、KKBOX資料科學年會同台尬大數據心法
  9. 【資料科學愛好者年會】數據說故事的年代,國際資料新聞人為台灣記者上一課
  10. 為什麼打造一支資料科學團隊如此重要?
  11. 混搭多樣的會議-2015 台灣資料科學愛好者年會
  12. 港大計算機教授:大資料時代也要有大教育思維
文章:

  1. 資料新聞實戰營 d|Bootcamp Taipei!

簡報:
  1. 2015 台灣資料科學愛好者年會-開場
  2. Key Failure Factors of Building a Data Science Team - 趙國仁
  3. 運用空間決策改進緊急醫療品質-詹大千
  4. 巨量與開放資料之創新機會與關鍵挑戰-曾新穆
  5. 以健保資料分析對抗健康新聞的恐慌症候群-張俊鴻
  6. 人口統計應用於選舉預測-蔡佳泓
  7. Learning for Big Data - 林軒田
  8. 海量視覺資料-孫民
  9. 由點、線至面:從影像分析角度探討漫畫的組成與風格-朱威達
  10. 心理學x資料科學-黃從仁
  11. Big Education in the Era of Big Data-金國慶
  12. 從網頁存取記錄瞭解使用者行為與網頁區塊貢獻分析-崔殷豪
  13. 資料科學在數位音樂的實踐與分析-KKBOX 林佑璟、羅經凱
  14. 雲端影音與物聯網平台的軟體工程挑戰:以 Skywatch 為例-陳維超
  15. 使用 Elasticsearch 及 Kibana 進行巨量資料搜尋及視覺化-曾書庭
  16. Visualization over Web: Tools and Tips-吳泰輝
  17. 軟工人的資料科學奇航-線上遊戲、網路學習與中華職棒 by 許懷中
  18. 計算社會學-江彥生
  19. 應用資料科學於交通網路解析-闕嘉宏
  20. 社會物理學-以意念流的數據化來打造智慧企業及城市 by 張毓倫
  21. 2015 台灣資料科學愛好者年會-閉幕

研討會共筆:


2015年7月29日 星期三

50個資料科學工具速查表(R、Python、Hadoop、Spark、Machine learning)

以下為國外整理的資料科學工具速查表,包含常見的工具R、Python、Hadoop、Spark,以及機器學習(Machine Learning)理論。


  1. R
  2. Python
  3. SQL
  4. Hadoop
  5. Spark
  6. Machine learning