比較 SparkR 和 sparklyr
重要
Databricks 中的 SparkR Databricks Runtime 16.0 和更新版本中已被取代。
適用於 R 使用者的 Apache Spark 有兩個 API:SparkR 和 sparklyr。 Databricks 建議您使用 sparklyr,因為 SparkR 已被取代。 為了協助您移轉程式代碼,本文會比較這些 API。
API 來源
SparkR 是由 Databricks 的 Spark 社群和開發人員所建置。 因此,SparkR 會緊隨 Spark Scala 類別,DataFrame API。
sparklyr 從 RStudio 開始,此後已捐贈給 Linux 基金會。 sparklyr 會在其程序設計樣式和透過與 dplyr dplyr的 API 互操作性,緊密整合至 tidyverse。
SparkR 和 sparklyr 極有能力在 R 中使用巨量數據。在過去的幾年裡,其特徵集越來越接近同位。
API 差異
下列程式代碼範例示範如何在 Azure Databricks 筆記本中使用 SparkR 和 sparklyr,將 範例數據集中的 CSV 檔案匯入至 的 Spark。
# #############################################################################
# SparkR usage
# Note: To load SparkR into a Databricks notebook, run the following:
# library(SparkR)
# You can then remove "SparkR::" from the following function call.
# #############################################################################
# Use SparkR to read the airlines dataset from 2008.
airlinesDF <- SparkR::read.df(path = "/databricks-datasets/asa/airlines/2008.csv",
source = "csv",
inferSchema = "true",
header = "true")
# Print the loaded dataset's class name.
cat("Class of SparkR object: ", class(airlinesDF), "\n")
# Output:
#
# Class of SparkR object: SparkDataFrame
# #############################################################################
# sparklyr usage
# Note: To install, load, and connect with sparklyr in a Databricks notebook,
# run the following:
# install.packages("sparklyr")
# library(sparklyr)
# sc <- sparklyr::spark_connect(method = "databricks")
# If you run "library(sparklyr)", you can then remove "sparklyr::" from the
# preceding "spark_connect" and from the following function call.
# #############################################################################
# Use sparklyr to read the airlines dataset from 2007.
airlines_sdf <- sparklyr::spark_read_csv(sc = sc,
name = "airlines",
path = "/databricks-datasets/asa/airlines/2007.csv")
# Print the loaded dataset's class name.
cat("Class of sparklyr object: ", class(airlines_sdf))
# Output:
#
# Class of sparklyr object: tbl_spark tbl_sql tbl_lazy tbl
不過,如果您嘗試從SparkR在 SparkDataFrame
對象上執行sparklyr函式,或嘗試在sparklyr的 tbl_spark
對象上執行SparkR函式,將無法運作,如下列程式代碼範例所示。
# Try to call a sparklyr function on a SparkR SparkDataFrame object. It will not work.
sparklyr::sdf_pivot(airlinesDF, DepDelay ~ UniqueCarrier)
# Output:
#
# Error : Unable to retrieve a Spark DataFrame from object of class SparkDataFrame
## Now try to call s Spark R function on a sparklyr tbl_spark object. It also will not work.
SparkR::arrange(airlines_sdf, "DepDelay")
# Output:
#
# Error in (function (classes, fdef, mtable) :
# unable to find an inherited method for function ‘arrange’ for signature ‘"tbl_spark", "character"’
這是因為sparklyr會將 dplyr 函式,例如 arrange
轉譯成 SparkSQL 所使用的 SQL 查詢計畫。 這不是 SparkR 的情況,SparkR 具有 SparkSQL tables 和 Spark DataFrame 的函式。 這些行為是 Databricks 不建議在相同腳本、筆記本或作業中結合 SparkR 和 sparklyr API 的原因。
API 互操作性
在罕見的情況下,where 您無法避免合併使用 SparkR 和 sparklyr API,您可以將 SparkSQL 作為一種橋梁。 例如,在本文的第一個範例中,sparklyr 將 2007 年的航空公司資料集載入到一個名為 airlines
的 table。 您可以使用 SparkR sql
函式來查詢此 table,例如:
top10delaysDF <- SparkR::sql("SELECT
UniqueCarrier,
DepDelay,
Origin
FROM
airlines
WHERE
DepDelay NOT LIKE 'NA'
ORDER BY DepDelay
DESC LIMIT 10")
# Print the class name of the query result.
cat("Class of top10delaysDF: ", class(top10delaysDF), "\n\n")
# Show the query result.
cat("Top 10 airline delays for 2007:\n\n")
head(top10delaysDF, 10)
# Output:
#
# Class of top10delaysDF: SparkDataFrame
#
# Top 10 airline delays for 2007:
#
# UniqueCarrier DepDelay Origin
# 1 AA 999 RNO
# 2 NW 999 EWR
# 3 AA 999 PHL
# 4 MQ 998 RST
# 5 9E 997 SWF
# 6 AA 996 DFW
# 7 NW 996 DEN
# 8 MQ 995 IND
# 9 MQ 994 SJT
# 10 AA 993 MSY
如需其他範例,請參閱 R中使用 DataFrames 和 tables。