比較SparkR和sparklyr

R之間的用戶可以選擇兩個api Apache火花:SparkRsparklyr。本文比較了這些api。磚建議你選擇其中一個api來開發一個火花應用r .從這兩種api結合代碼到一個腳本或磚筆記本或工作可以使你的代碼更難以閱讀和維護。

API的起源

SparkR引發社會的構建和開發人員從磚。正因為如此,SparkR密切遵循的火花Scala類DataFrame API

sparklyr開始時RStudio和已經被Linux基金會捐贈。sparklyr緊密集成到tidyverse通過API編程風格和互操作性dplyr

SparkR和sparklyr具有很強的處理大數據在r .在過去的幾年中,他們的特性集接近平價。

API的差異

以下代碼示例展示了如何使用SparkR和sparklyr磚筆記本讀的CSV文件樣本數據集火花。

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## SparkR用法#注意:SparkR加載到一個磚筆記本,運行以下:#庫(SparkR)#你可以移除“SparkR::”下麵的函數調用。# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##使用SparkR讀航空公司2008年的數據集。airlinesDF< -SparkR::read.df(路徑=“databricks-datasets / asa /航空/ 2008. csv”,=“csv”,inferSchema=“真正的”,=“真正的”)#打印數據集加載的類名。(“SparkR對象:類”,(airlinesDF),“\ n”)#輸出:## SparkR對象的類:SparkDataFrame# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## sparklyr用法#注意:安裝、加載和聯係sparklyr磚的筆記本,#運行以下:# install.packages (“sparklyr”)#庫(sparklyr)# sc < - sparklyr: spark_connect(方法=“磚”)#如果你運行”庫(sparklyr)”,you can then remove "sparklyr::" from the#前“spark_connect”和下麵的函數調用。# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##使用sparklyr讀航空公司2007年的數據集。airlines_sdf< -sparklyr::spark_read_csv(sc=sc,的名字=“航空公司”,路徑=“databricks-datasets / asa /航空/ 2007. csv”)#打印數據集加載的類名。(“sparklyr對象:類”,(airlines_sdf))#輸出:## sparklyr對象的類:tbl_spark tbl_sql tbl_lazy台

然而,如果你試圖運行sparklyr函數SparkDataFrame從SparkR對象,或者如果你試圖運行一個SparkR函數上tbl_spark從sparklyr對象,它不會工作,如以下代碼示例所示。

#試圖調用sparklyr函數SparkR SparkDataFrame對象。它不會工作。sparklyr::sdf_pivot(airlinesDF,DepDelay~UniqueCarrier)#輸出:#錯誤:無法檢索火花DataFrame SparkDataFrame對象的類# #現在試圖調用s火花R函數sparklyr tbl_spark對象。它也不會工作。SparkR::安排(airlines_sdf,“DepDelay”)#輸出:##錯誤(函數(類、fdef mtable):#無法找到一種遺傳方法函數“安排”簽名的“tbl_spark”、“性格”

這是因為sparklyr翻譯dplyr等功能安排到一個SQL查詢計劃SparkSQL所使用。與SparkR情況不是這樣,這為SparkSQL表和火花DataFrames功能。這些行為是為什麼磚不建議結合SparkR和sparklyr api相同的腳本,筆記本,或者工作。

API的互操作性

在極少數情況下,你無法避免結合SparkR和sparklyr api,您可以使用SparkSQL作為一種橋。例如,在本文的第一個例子,sparklyr從2007年航空公司數據集加載到一個表命名航空公司。您可以使用SparkRsql函數查詢這個表,例如:

top10delaysDF< -SparkR::sql(“選擇UniqueCarrier,DepDelay,起源航空公司在哪裏DepDelay不像“NA”ORDER BY DepDelayDESC限製10”)#打印查詢結果的類名。(“階級的top10delaysDF:“,(top10delaysDF),“\ n \ n”)#顯示查詢結果。(“2007年十大航空公司延誤:\ n \ n”)(top10delaysDF,10)#輸出:## top10delaysDF類:SparkDataFrame## 2007年十大航空公司延誤:## UniqueCarrier DepDelay起源# 1 AA 999汽車# 2西北999英文文宣寫作研習營# 3 AA 999 PHL# 4 998 RST MQ# 5 9 e 997 SWF# 6 996 DFW AA# 7西北996窩# 8 MQ 995印第安納州# 9 994 SJT MQ# 993 MSY AA

附加的例子,請參閱在R DataFrames和表工作