<b>2.5 資料集連接配接</b>
<b></b>
本節,我們将介紹資料連接配接的技術,并讨論spark處理資料連接配接的特有的特征,以及一些使工作更容易進行的資料連接配接解決方案。
學習完本節,我們将有能力按照各類機器學習需要做資料連接配接。
2.5.1 資料連接配接及其工具——spark sql
為機器學習項目準備資料集時,我們一般需要組合多個資料集。關系表通過主鍵和外鍵進行連接配接。
連接配接兩個及以上的資料集聽起來容易,但做起來非常有挑戰,并且非常耗時。在sql語句中,select是最常用的指令。作為例子,下面是一個執行連接配接的典型的sql代碼:
為執行上面提到的表連接配接任務,資料科學家和機器學習從業者經常使用他們熟悉的sql工具。在spark環境中,spark sql就是為此開發的工具。
spark sql能夠讓使用者在spark開發環境中使用sql或 dataframe api查詢結構化資料,這些在r notebook中依然可以使用。spark sql重用了hive的前端和中繼資料,與hive資料和查詢完全相容。
spark sql包含一個基于成本的優化器、列存儲和代碼生成器以生成快速的查詢。同時,spark sql使用spark引擎将查詢擴充到幾千個節點并耗費多個小時,它支援查詢過程中的容錯機制。
使用spark sql時,有兩個主要的元件:dataframe和sqlcontext。
正如前面讨論的,dataframe是一個組織成列的分布式資料集。它基于r語言的資料框,并與關系資料庫的資料表類似。spark sql通過sqlcontext封裝了所有關系函數。
2.5.2 spark中的資料集連接配接
這裡,我們通過一些執行個體展示使用spark sql的方法和相關過程。
為便于分析,設想應用程式包含下面的4個資料表:
至少,我們需要将user和events兩個表連接配接起來,使用下面的代碼完成連接配接:
spark sql的結果以rdd的形式存儲,與spark其他庫互動比較少。上面傳回的結果可以直接用于機器學習。
從上面的例子看到,spark sql使得為機器學習算法準備資料而進行的不同資料集連接配接非常友善。進一步講,spark sql允許開發者簡便地操作和連接配接機器學習算法的輸出結果,進而生成想要的結果。
更多關于spark sql使用的資訊,請通路:http://spark.apache.org/docs/1.0.0/sql-programming-guide.html。
2.5.3 使用r語言資料表程式包進行資料連接配接
相比以前,spark已經使得資料操作更快、資料分析更容易了。
根據spark開發團隊的初衷,開發spark sql的目的是為了:
編寫少量的代碼
讀取少量的資料
将一些困難的工作交給優化器完成
這都是通過使用dataframe和spark sql指令sqlcontext.read和 df.write實作的。
除了spark sql,data.table程式包功能非常強大,使用者也可以使用r語言連接配接表。開發data.table程式包的主要目的是:
快速合并大量的資料(例如:記憶體中資料100gb),快速的排序連接配接
在不使用複制指令的情況下,按組快速增加/修改/删除列資料
按列進行資料表和快速的檔案讀取(fread)
該程式包為開發人員提供了自然和靈活的文法。
使用data.table進行連接配接,你首先需要建立data.frame,這非常容易。然後,使用x[y]連接配接兩個表。
這被稱為末次觀測值結轉(last observation carried forward,locf) 或滾動連接配接。
x[y]是data.table x和data.table y 兩個表之間的連接配接。如果y有兩列,第一列與x的第一列的key比對,兩個表的第二列也互相比對。預設情況下執行equi-join,也就是值必須相等。
除了等值連接配接,還有滾動連接配接:
如前所述,y的第一列與x的第一列比對,也就是值相等。然而,y中的最後一個連接配接列,即例子中的第二列,被特殊處理。在第一列比對的情況下,如果未找到比對項,将傳回上一行的值。
其他控制包括:前滾、後滾、復原至最近項和限時滾動。
在提示符下,輸入下面的指令檢視例子。
r語言data.table提供了增強版data.frame,包括:
快速合并大量資料——例如,100gb(檢視一下高達20億行的測試基準)。
快速的排序連接配接——例如,前滾、後滾、復原至最近項和限時滾動。
快速的重疊範圍連接配接——例如,genomicranges。
在2.2.3節,為便于分析我們給出了4個表:
在這個例子中,上一節我們擷取了第一個資料的一個子集,然後與第四個資料彙集。現在,将它們連接配接在一起。如上一節,在r notebook上混合使用spark sql 和r語言,使資料連接配接更容易。