В коде Spark вы, возможно, видели, что DataFrame и RDD используются одинаково, и задавались вопросом: «В чем разница между ними?»

При аналогичном использовании есть некоторые важные различия между DataFrames и RDD. DataFrames требует схемы, и вы можете думать о них как о «таблицах» данных. RDD менее структурированы и ближе к коллекциям или спискам Scala.

Однако самое большое различие между DataFrames и RDD заключается в том, что операции над DataFrames оптимизируются с помощью Spark, тогда как операции с RDD являются обязательными и выполняются через преобразования и действия по порядку.

RDD (устойчивый распределенный набор данных) - это последовательность операций, которые должны выполняться распределенным образом.

Например, если мы создадим RDD и проделаем с ним какие-то операции:

val rdd1 = sc.parallelize(data1)
val rdd2 = sc.parallelize(data2)
rdd1
.join(rdd2)
.filter(name => name = "pikachu")
.cache

Наш RDD будет фактически последовательностью операций, выполняемых в указанном порядке:

DataFrame реализован как RDD под капотом: он также приводит к списку операций, которые должны быть выполнены. Основное отличие состоит в том, что это оптимизированный список операций.

Операции, которые вы выбираете для выполнения с DataFrame, фактически выполняются оптимизатором запросов (Catalyst) со списком правил, которые должны применяться к DataFrame, а также помещаются в специальный формат для ЦП. и эффективность памяти (Вольфрам). С обоими из них выводимый план запроса сильно оптимизирован.

Например, если мы создадим DataFrame с некоторыми операциями:

val dataframe1 = spark.read
  .option("header", "true")
  .option("inferSchema", "true")
  .csv("data1.csv")
val dataframe2 = spark.read
  .option("header", "true")
  .option("inferSchema", "true")
  .csv("data2.csv")
dataframe1
.join(dataframe2, dataframe1("id") === dataframe2("id")))
.filter("name = 'pikachu'")
.cache

Наш DataFrame фактически будет запускаться через оптимизатор, который создаст план запроса с измененными операциями, чтобы они были более эффективными, без изменения результатов.

В общем, DataFrames следует использовать поверх RDD, потому что они хорошо оптимизированы. Вы можете использовать RDD вместо DataFrame (например, dataframe.toRDD), если вам нужно контролировать поток плана запроса.

Возможно, наиболее распространенная причина, по которой RDD используются в старом коде, заключается в том, что DataFrames являются относительно новыми (апрель 2016 г.). В этом случае переход на DataFrames может оказаться весьма полезным!