次の方法で共有


SparkR と sparklyr の比較

重要

Databricks Runtime 16.0 以降では、Databricks の SparkR は 非推奨 となります。

Apache Spark for R ユーザーには、SparkR と sparklyr の 2 つの API があります。 Databricks では、SparkR が非推奨になった sparklyrを使用することをお勧めします。 コードの移行に役立つよう、この記事ではこれらの API を比較します。

API の起源

SparkR は、Databricks の Spark コミュニティと開発者によって構築されています。 このため、SparkR は Spark Scala クラスの と dataFrame API に厳密に従います。

sparklyrRStudio から始まり、その後 Linux Foundation に寄付されています。 sparklyr は、プログラミング スタイルと、dplyrとの API 相互運用性の両方で、の tidyverse に緊密に統合されています。

SparkR と sparklyr は、R でビッグ データを操作する能力が高い。過去数年以内に、これらの機能セットはパリティに近づいてきています。

API の相違点

次のコード例は、Azure Databricks ノートブックから SparkR と sparklyr を使用して、spark に サンプル データセットから CSV ファイルを読み取る方法を示しています。

# #############################################################################
# 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 が arrange などの dplyr 関数を、SparkSQL で使用される SQL クエリ プランに変換するためです。 SparkSQL テーブルと Spark DataFrames 用の関数を持つ SparkR には、これは当てはまりません。 これらの動作は、Databricks が同じスクリプト、ノートブック、またはジョブで SparkR API と sparklyr API を組み合わせることを推奨しない理由です。

API の相互運用性

まれに、SparkR API と sparklyr API の組み合わせを回避できない場合は、SparkSQL をブリッジの一種として使用できます。 たとえば、この記事の最初の例では、sparklyr は 2007 年の航空会社データセットを airlines という名前のテーブルに読み込みます。 SparkR sql 関数を使用して、次の例に示すテーブルに対してクエリを実行できます。

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 で DataFrame とテーブルを操作する」を参照してください。