メインコンテンツまでスキップ

SparkRとSparklyrの比較

important

Databricks の SparkR は、Databricks Runtime 16.0 以降では 非推奨とされています

R ユーザー向けの には、SparkRSparklyr の 2 つのAPIsApache Spark が用意されています。Databricksでは、Sparklyr SparkRが非推奨 ため、 Sparklyr を使用することをお勧めします。コードの移行に役立つように、この記事では次の APIsを比較します。

API の配信元

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

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

SparkRとsparklyrは、Rのビッグデータを扱う能力が高いです。ここ数年で、両者の機能セットは同等に近づいています。

API の違い

次のコード例は、SparkR Databricksノートブックの と SparklyrCSV を使用して、Sample データセット の ファイルをSpark に読み込む方法を示しています。

R
# #############################################################################
# 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 関数を実行しようとすると、次のコード例に示すように機能しません。

R
# 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 クエリ プランに変換するためです。 SparkRこれは、SparkSQL テーブルと の関数を持つSparkデータフレーム には当てはまりません。これらの動作によりDatabricksSparkR と Sparklyr APIsを同じスクリプト、ノートブック、またはジョブで組み合わせることを推奨しません。

API の相互運用性

SparkRとSparklyrのAPIsを組み合わせることが避けられないまれなケースでは、SparkSQLを一種のブリッジとして使用することができます。たとえば、この記事の最初の例では、Sparklyr は 2007 年の airlines データセットを airlinesという名前のテーブルに読み込みました。 SparkR sql 関数を使用して、次のようにこのテーブルをクエリできます。

R
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 での データフレーム とテーブルの操作」を参照してください。