Разница между DataFrame, Dataset и RDD в Spark

Мне просто интересно, какая разница между RDD и DataFrame (Spark 2.0.0 DataFrame - простой псевдоним типа для Dataset[Row]) в Apache Spark?

Можете ли вы преобразовать один в другой?

4b9b3361

A DataFrame хорошо определен с поиском google для определения "DataFrame":

Кадр данных представляет собой таблицу или двухмерную структуру, подобную массиву, в каждый столбец содержит измерения по одной переменной, и каждая строка содержит один случай.

Таким образом, DataFrame имеет дополнительные метаданные из-за своего табличного формата, что позволяет Spark выполнять определенные оптимизации по завершенному запросу.

An RDD, с другой стороны, представляет собой просто R esilient D istributed D ataset, который больше представляет собой черный ящик данные, которые не могут быть оптимизированы как операции, которые могут быть выполнены против него, не так ограничены.

Однако вы можете перейти от DataFrame к RDD с помощью метода RDD, и вы можете перейти от RDD к DataFrame (если RDD находится в табличном формате) с помощью toDF метод

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

177
ответ дан 20 июля '15 в 6:09
источник

Во-первых, DataFrame развивается из SchemaRDD.

depreated method toSchemaRDD

Да.. конвертация между Dataframe и RDD абсолютно возможна.

Ниже приведены некоторые примеры фрагментов кода.

  • df.rdd - RDD[Row]

Ниже приведены некоторые варианты создания dataframe.

  • 1) yourrddOffrow.toDF преобразуется в DataFrame.

  • 2) Использование createDataFrame из sql-контекста

    val df = spark.createDataFrame(rddOfRow, schema)

где схема может быть из некоторых из нижеперечисленных опций, как описано nice SO post..
Из класса scala case и scala reflection api

import org.apache.spark.sql.catalyst.ScalaReflection
val schema = ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType]

ИЛИ используя Encoders

import org.apache.spark.sql.Encoders
val mySchema = Encoders.product[MyCaseClass].schema

как описано в Схеме, также можно создать с помощью StructType и StructField

val schema = new StructType()
  .add(StructField("id", StringType, true))
  .add(StructField("col1", DoubleType, true))
  .add(StructField("col2", DoubleType, true)) etc...

image description

На самом деле есть 3 API Apache Spark.

enter image description here

  1. RDD API:

API RDD (Resilient Distributed Dataset) находится в Spark с момента выпуска 1.0.

API RDD предоставляет множество методов преобразования, таких как map(), filter() и reduce() для выполнения вычислений по данным. Каждый из этих методов приводит к новому RDD представляющему преобразованные данные. Однако эти методы просто определяют операции, которые должны выполняться, и преобразования не выполняются до тех пор, пока не будет вызван метод действия. Примерами методов действий являются collect() и saveAsObjectFile().

Пример RDD:

rdd.filter(_.age > 21) // transformation
   .map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action

Пример: Фильтровать по атрибуту с помощью RDD

rdd.filter(_.age > 21)
  1. API DataFrame

Spark 1.3 представила новый API DataFrame в рамках инициативы Project Tungsten, которая направлена на повышение производительности и масштабируемости Spark. API DataFrame представляет концепцию схемы для описания данных, позволяя Spark управлять схемой и только передавать данные между узлами гораздо более эффективным способом, чем использование сериализации Java.

API DataFrame радикально отличается от API RDD поскольку он представляет собой API для построения реляционного плана запросов, который затем может выполнять оптимизатор искры Catalyst. API является естественным для разработчиков, знакомых с построением планов запросов

Пример стиля SQL:

df.filter("age > 21");

Ограничения: поскольку код относится к атрибутам данных по имени, компилятор не может поймать какие-либо ошибки. Если имена атрибутов неверны, ошибка будет обнаружена только во время выполнения, когда будет создан план запроса.

Еще одним недостатком API DataFrame является то, что он очень scala-centric, и хотя он поддерживает Java, поддержка ограничена.

Например, при создании DataFrame из существующего RDD объектов Java оптимизатор Sparks Catalyst не может вывести схему и предполагает, что любые объекты в DataFrame реализуют интерфейс scala.Product. case class Scala case class окно, потому что они реализуют этот интерфейс.

  1. API Dataset

API Dataset, выпущенный как предварительный просмотр API в Spark 1.6, призван обеспечить лучшее из обоих миров; знакомый объектно-ориентированный стиль программирования и тип времени в RDD API, но с преимуществами производительности оптимизатора запросов Catalyst. Наборы данных также используют тот же эффективный механизм хранения кучи, что и API DataFrame.

Когда дело доходит до сериализации данных, API-интерфейс Dataset имеет концепцию кодировщиков, которые транслируют между представлениями JVM (объектов) и внутренним двоичным форматом Sparks. У Spark есть встроенные энкодеры, которые очень продвинуты в том, что они генерируют байт-код для взаимодействия с данными без кучи и обеспечивают доступ по требованию к отдельным атрибутам без необходимости де-сериализации целого объекта. Spark еще не предоставляет API для реализации пользовательских кодеров, но это планируется для будущей версии.

Кроме того, API Dataset разработан так, чтобы работать одинаково хорошо с Java и Scala. При работе с объектами Java важно, чтобы они были полностью совместимы с bean-совместимыми.

Пример API-интерфейс Dataset :

dataset.filter(_.age < 21);

Оценки разн. между DataFrame & DataSet : enter image description here

Дальнейшее чтение... databricks article

158
ответ дан 19 авг. '16 в 10:23
источник

Apache Spark предоставляет три типа API

  • РДД
  • DataFrame
  • Dataset

Сравнение API-интерфейсов RDD, Dataframe и Dataset

Вот сравнение API между RDD, Dataframe и Dataset.

РДД

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

Особенности RDD: -

  • Распределенная коллекция:
    RDD использует операции MapReduce, которые широко используются для обработки и создания больших наборов данных с параллельным распределенным алгоритмом на кластере. Это позволяет пользователям писать параллельные вычисления, используя набор операторов высокого уровня, не беспокоясь о распределении работы и отказоустойчивости.

  • Необязательные: RDD, состоящие из набора разделяемых записей. Раздел является базовой единицей parallelism в RDD, и каждый раздел представляет собой одно логическое разделение данных, которое является неизменным и создается посредством некоторых преобразований на существующих разделах. Возможность использования помогает достичь согласованности в вычислениях.

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

  • ленивые оценки: Все преобразования в Spark ленивы, поскольку они не сразу вычисляют их результаты. Вместо этого они просто помнят преобразования, применяемые к некоторому базовому набору данных. Преобразования вычисляются только тогда, когда действие требует, чтобы результат возвращался в программу драйвера.

  • Функциональные преобразования: RDD поддерживают два типа операций: преобразования, которые создают новый набор данных из существующего, и действия, которые возвращают значение программе драйвера после выполнения вычисления в наборе данных.

  • Форматы обработки данных:
    Он может легко и эффективно обрабатывать данные, которые структурированы, а также неструктурированные данные.

  • Поддерживаемые языки программирования:
    RDD API доступен в Java, Scala, Python и R.

Ограничения RDD: -

  • Нет встроенного механизма оптимизации: При работе со структурированными данными RDD не могут воспользоваться преимуществами оптимизаторов Sparks, включая оптимизатор катализаторов и двигатель исполнения вольфрама. Разработчикам необходимо оптимизировать каждый RDD на основе его атрибутов.

  • Обработка структурированных данных: В отличие от Dataframe и наборов данных, RDD не выводят схему проглатываемых данных и требуют, чтобы пользователь указал ее.

Dataframes

Spark представил Dataframes в выпуске Spark 1.3. Dataframe преодолевает основные проблемы, с которыми сталкиваются RDD.

DataFrame - это распределенный набор данных, организованный в именованные столбцы. Он концептуально эквивалентен таблице в реляционной базе данных или R/Python Dataframe. Наряду с Dataframe, Spark также представил оптимизатор катализаторов, который использует расширенные возможности программирования для создания расширяемого оптимизатора запросов.

Функции Dataframe: -

  • Распределенная коллекция объекта Row: DataFrame представляет собой распределенный сбор данных, организованный в именованные столбцы. Он концептуально эквивалентен таблице в реляционной базе данных, но с более богатыми оптимизациями под капотом.

  • Обработка данных: Обработка структурированных и неструктурированных форматов данных (Avro, CSV, эластичный поиск и Cassandra) и систем хранения (таблицы HDFS, HIVE, MySQL и т.д.). Он может читать и писать из всех этих различных источников данных.

  • Оптимизация с использованием оптимизатора катализатора: Он поддерживает как SQL-запросы, так и API DataFrame. Dataframe использует структуру трансформации дерева катализатора в четыре фазы,

    1.Analyzing a logical plan to resolve references
    2.Logical plan optimization
    3.Physical planning
    4.Code generation to compile parts of the query to Java bytecode.
    
  • Совместимость улья:Используя Spark SQL, вы можете запускать немодифицированные запросы Hive на существующих складах Hive. Он повторно использует интерфейс "Привет" и MetaStore и дает вам полную совместимость с существующими данными, запросами и UDF для Hive.

  • Вольфрам: Tungsten обеспечивает физическое исполняющее устройство, которое явно управляет памятью и динамически генерирует байт-код для оценки выражения.

  • Поддерживаемые языки программирования:
    API Dataframe доступен в Java, Scala, Python и R.

Ограничения Dataframe: -

  • Безопасность типа компиляции: Как обсуждалось, API Dataframe не поддерживает безопасность времени компиляции, которая ограничивает вас манипулированием данными, когда структура не знает. Следующий пример работает во время компиляции. Однако при выполнении этого кода вы получите исключение Runtime.

Пример:

case class Person(name : String , age : Int) 
val dataframe = sqlContext.read.json("people.json") 
dataframe.filter("salary > 10000").show 
=> throws Exception : cannot resolve 'salary' given input age , name

Это особенно важно, когда вы работаете с несколькими шагами преобразования и агрегации.

  • Невозможно использовать объект домена (объект потерянного домена): После того как вы превратили объект домена в dataframe, вы не сможете его восстановить. В следующем примере, как только мы создали personDF из personRDD, мы не будем восстанавливать исходный класс RDD класса Person (RDD [Person]).

Пример:

case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
personDF.rdd // returns RDD[Row] , does not returns RDD[Person]

API наборов данных

Dataset API - это расширение для DataFrames, которое обеспечивает безопасный по типу объект-ориентированный интерфейс программирования. Это сильно типизированная, неизменяемая коллекция объектов, которые отображаются в реляционную схему.

В основе набора данных API - это новая концепция, называемая кодировщиком, которая отвечает за преобразование объектов JVM и табличного представления. Табличное представление хранится с использованием внутреннего двоичного формата Spark во дворе, позволяющего работать с сериализованными данными и улучшать использование памяти. Spark 1.6 поддерживает автоматическую генерацию кодировщиков для самых разных типов, включая примитивные типы (например, String, Integer, Long), классы классов Scala и Java Beans.

Особенности набора данных: -

  • Обеспечивает лучшее из RDD и Dataframe: RDD (функциональное программирование, безопасный тип), DataFrame (реляционная модель, оптимизация запросов, выполнение вольфрама, сортировка и перетасовка)

  • кодеры: С помощью Encoders легко преобразовать любой объект JVM в набор данных, позволяя пользователям работать как с структурированными, так и с неструктурированными данными, в отличие от Dataframe.

  • Поддерживаемые языки программирования: API Datasets в настоящее время доступен только в Scala и Java. В настоящее время Python и R не поддерживаются в версии 1.6. Поддержка Python для версии 2.0.

  • Тип безопасности: API-интерфейс Datasets обеспечивает безопасность времени компиляции, которая недоступна в Dataframes. В приведенном ниже примере мы видим, как Dataset может работать с объектами домена с компилируемыми лямбда-функциями.

Пример:

case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
val ds:Dataset[Person] = personDF.as[Person]
ds.filter(p => p.age > 25)
ds.filter(p => p.salary > 25)
 // error : value salary is not a member of person
ds.rdd // returns RDD[Person]
  • Взаимодействие: Наборы данных позволяют легко преобразовывать существующие RDD и Dataframes в массивы данных без кода шаблона.

Ограничения API набора данных: -

  • Требуется литье типов в String: Запрос данных из наборов данных в настоящее время требует от нас указать поля в классе как строку. Как только мы запросили данные, мы вынуждены использовать столбцы для требуемого типа данных. С другой стороны, если мы используем операцию отображения на наборах данных, он не будет использовать оптимизатор Catalyst.

Пример:

ds.select(col("name").as[String], $"age".as[Int]).collect()

Нет поддержки для Python и R: начиная с версии 1.6, Datasets поддерживает только Scala и Java. Поддержка Python будет представлена ​​в Spark 2.0.

API Datasets API обладает несколькими преимуществами по сравнению с существующими API RDD и Dataframe с улучшенным безопасным типом и функциональным программированием. С проблемой требований к типу литья в API вы все равно не будете требовать безопасности типа и сделаете ваш код хрупким.

112
ответ дан 22 сент. '16 в 8:50
источник

РДД

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

Особенности RDD: -

  • Распределенная коллекция:
    RDD использует операции MapReduce, которые широко используются для обработки и создания больших наборов данных с параллельным распределенным алгоритмом на кластере. Это позволяет пользователям писать параллельные вычисления, используя набор операторов высокого уровня, не беспокоясь о распределении работы и отказоустойчивости.

  • Необязательные: RDD, состоящие из набора разделяемых записей. Раздел является базовой единицей parallelism в RDD, и каждый раздел представляет собой одно логическое разделение данных, которое является неизменным и создается посредством некоторых преобразований на существующих разделах. Возможность использования помогает достичь согласованности в вычислениях.

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

  • ленивые оценки: Все преобразования в Spark ленивы, поскольку они не сразу вычисляют их результаты. Вместо этого они просто помнят преобразования, применяемые к некоторому базовому набору данных. Преобразования вычисляются только тогда, когда действие требует, чтобы результат возвращался в программу драйвера.

  • Функциональные преобразования: RDD поддерживают два типа операций: преобразования, которые создают новый набор данных из существующего, и действия, которые возвращают значение программе драйвера после выполнения вычисления в наборе данных.

  • Форматы обработки данных:

Он может легко и эффективно обрабатывать данные, которые структурированы, а также неструктурированные данные.

  • Поддерживаемые языки программирования:
    RDD API доступен в Java, Scala, Python и R.

Ограничения RDD: -

  • Нет встроенного механизма оптимизации: При работе со структурированными данными RDD не могут воспользоваться преимуществами оптимизаторов Sparks, включая оптимизатор катализаторов и двигатель исполнения вольфрама. Разработчикам необходимо оптимизировать каждый RDD на основе его атрибутов.

  • Обработка структурированных данных: В отличие от Dataframe и наборов данных, RDD не выводят схему проглатываемых данных и требуют, чтобы пользователь указал ее.

Dataframes

Spark представил Dataframes в выпуске Spark 1.3. Dataframe преодолевает основные проблемы, с которыми сталкиваются RDD.

DataFrame - это распределенный набор данных, организованный в именованные столбцы. Он концептуально эквивалентен таблице в реляционной базе данных или R/Python Dataframe. Наряду с Dataframe, Spark также представил оптимизатор катализаторов, который использует расширенные возможности программирования для создания расширяемого оптимизатора запросов.

Функции Dataframe: -

  • Распределенная коллекция объекта Row: DataFrame представляет собой распределенный сбор данных, организованный в именованные столбцы. Он концептуально эквивалентен таблице в реляционной базе данных, но с более богатыми оптимизациями под капотом.

  • Обработка данных: Обработка структурированных и неструктурированных форматов данных (Avro, CSV, эластичный поиск и Cassandra) и систем хранения (таблицы HDFS, HIVE, MySQL и т.д.). Он может читать и писать из всех этих различных источников данных.

  • Оптимизация с использованием оптимизатора катализатора: Он поддерживает как SQL-запросы, так и API DataFrame. Dataframe использует структуру трансформации дерева катализатора в четыре фазы,

    1.Analyzing a logical plan to resolve references
    2.Logical plan optimization
    3.Physical planning
    4.Code generation to compile parts of the query to Java bytecode.
    
  • Совместимость улья: Используя Spark SQL, вы можете запускать немодифицированные запросы Hive на существующих складах Hive. Он повторно использует интерфейс "Привет" и MetaStore и дает вам полную совместимость с существующими данными, запросами и UDF для Hive.

  • Вольфрам: Tungsten обеспечивает физическое исполняющее устройство, которое явно управляет памятью и динамически генерирует байт-код для оценки выражения.

  • Поддерживаемые языки программирования:
    API Dataframe доступен в Java, Scala, Python и R.

Ограничения Dataframe: -

  • Безопасность типа компиляции: Как обсуждалось, API Dataframe не поддерживает безопасность времени компиляции, которая ограничивает вас манипулированием данными, когда структура не знает. Следующий пример работает во время компиляции. Однако при выполнении этого кода вы получите исключение Runtime.

Пример:

case class Person(name : String , age : Int) 
val dataframe = sqlContect.read.json("people.json") 
dataframe.filter("salary > 10000").show 
=> throws Exception : cannot resolve 'salary' given input age , name

Это особенно важно, когда вы работаете с несколькими шагами преобразования и агрегации.

  • Невозможно использовать объект домена (объект потерянного домена): После того как вы превратили объект домена в dataframe, вы не сможете его восстановить. В следующем примере, как только мы создали personDF из personRDD, мы не будем восстанавливать исходный класс RDD класса Person (RDD [Person]).

Пример:

case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContect.createDataframe(personRDD)
personDF.rdd // returns RDD[Row] , does not returns RDD[Person]

API наборов данных

Dataset API - это расширение для DataFrames, которое обеспечивает безопасный по типу объект-ориентированный интерфейс программирования. Это сильно типизированная, неизменяемая коллекция объектов, которые отображаются в реляционную схему.

В основе набора данных API - это новая концепция, называемая кодировщиком, которая отвечает за преобразование объектов JVM и табличного представления. Табличное представление хранится с использованием внутреннего двоичного формата Spark во дворе, позволяющего работать с сериализованными данными и улучшать использование памяти. Spark 1.6 поставляется с поддержкой автоматического генерации кодировщиков для самых разных типов, включая примитивные типы (например, String, Integer, Long), классы классов Scala и Java Beans.

Особенности набора данных: -

  • Обеспечивает лучшее из RDD и Dataframe: RDD (функциональное программирование, безопасный тип), DataFrame (реляционная модель, оптимизация запросов, выполнение вольфрама, сортировка и перетасовка)

  • кодеры: С помощью Encoders легко преобразовать любой объект JVM в набор данных, позволяя пользователям работать как с структурированными, так и с неструктурированными данными, в отличие от Dataframe.

  • Поддерживаемые языки программирования: API Datasets в настоящее время доступен только в Scala и Java. В настоящее время Python и R не поддерживаются в версии 1.6. Поддержка Python для версии 2.0.

  • Тип безопасности: API-интерфейс Datasets обеспечивает безопасность времени компиляции, которая недоступна в Dataframes. В приведенном ниже примере мы видим, как Dataset может работать с объектами домена с компилируемыми лямбда-функциями.

Пример:

case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContect.createDataframe(personRDD)
val ds:Dataset[Person] = personDF.as[Person]
ds.filter(p => p.age > 25)
ds.filter(p => p.salary > 25)
 // error : value salary is not a member of person
ds.rdd // returns RDD[Person]
  • Взаимодействие: Наборы данных позволяют легко преобразовывать существующие RDD и Dataframes в массивы данных без кода шаблона.

Ограничения API набора данных: -

  • Требуется литье типов в String: Запрос данных из наборов данных в настоящее время требует от нас указать поля в классе как строку. Как только мы запросили данные, мы вынуждены использовать столбцы для требуемого типа данных. С другой стороны, если мы используем операцию отображения на наборах данных, он не будет использовать оптимизатор Catalyst.

Пример:

ds.select(col("name").as[String], $"age".as[Int]).collect()

Нет поддержки для Python и R: начиная с версии 1.6, Datasets поддерживает только Scala и Java. Поддержка Python будет представлена ​​в Spark 2.0.

API Datasets API обладает несколькими преимуществами по сравнению с существующими API RDD и Dataframe с улучшенным безопасным типом и функциональным программированием. С проблемой требований к типу литья в API вы все равно не будете требовать безопасности типа и сделаете ваш код хрупким.

57
ответ дан 21 сент. '16 в 8:37
источник

Все (RDD, DataFrame и DataSet) в одной картинке

RDD vs DataFrame vs DataSet

кредиты изображения

РДД

RDD - это отказоустойчивая совокупность элементов, которые могут работать параллельно.

DataFrame

DataFrame - это набор данных, организованный в именованные столбцы. Концептуально это эквивалентно таблице в реляционной базе данных или фрейму данных в R/Python, но с более богатой оптимизацией.

Dataset

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


Замечания:

Набор данных строк (Dataset[Row]) в Scala/Java часто будет называться DataFrames.


Хорошее сравнение всех их с фрагментом кода

RDD vs DataFrame vs DataSet with code

источник


В: Можете ли вы преобразовать одно в другое, например, в RDD, в DataFrame или наоборот?

Да, возможны оба

1. RDD для DataFrame с .toDF()

val rowsRdd: RDD[Row] = sc.parallelize(
  Seq(
    Row("first", 2.0, 7.0),
    Row("second", 3.5, 2.5),
    Row("third", 7.0, 5.9)
  )
)

val df = spark.createDataFrame(rowsRdd).toDF("id", "val1", "val2")

df.show()
+------+----+----+
|    id|val1|val2|
+------+----+----+
| first| 2.0| 7.0|
|second| 3.5| 2.5|
| third| 7.0| 5.9|
+------+----+----+

другие способы: преобразовать объект RDD в Dataframe в Spark

2. DataFrame/DataSet to RDD с .rdd()

val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD
25
ответ дан 22 июля '17 в 12:37
источник

Просто RDD является основным компонентом, но DataFrame представляет собой API, введенный в искру 1.30.

РДД

Сбор разделов данных, называемых RDD. Эти RDD должны следовать нескольким свойствам, таким как:

  • Неизменное,
  • Отказоустойчивость,
  • Распространяется,
  • Дополнительно.

Здесь RDD либо структурирован, либо неструктурирован.

DataFrame

DataFrame - это API, доступный в Scala, Java, Python и R. Он позволяет обрабатывать любые типы структурированных и полуструктурированных данных. Чтобы определить DataFrame, набор распределенных данных, организованный в именованные столбцы под названием DataFrame. Вы можете легко оптимизировать RDDs в DataFrame. Вы можете обрабатывать данные JSON, данные паркета, данные HiveQL за раз, используя DataFrame.

val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")

val sample_DF = sampleRDD.toDF()

Здесь Sample_DF рассматривается как DataFrame. sampleRDD - это (необработанные данные), называемые RDD.

23
ответ дан 30 окт. '15 в 17:07
источник

Поскольку DataFrame слабо типизирован, а разработчики не получают преимущества системы типов. Например, скажем, вы хотите что-то прочитать из SQL и выполнить некоторую агрегацию на нем:

val people = sqlContext.read.parquet("...")
val department = sqlContext.read.parquet("...")

people.filter("age > 30")
  .join(department, people("deptId") === department("id"))
  .groupBy(department("name"), "gender")
  .agg(avg(people("salary")), max(people("age")))

Когда вы говорите people("deptId"), вы не возвращаете Int или Long, вы возвращаете объект Column который вам нужно использовать. На языках с такими богатыми типами систем, как Scala, вы теряете всю безопасность типов, что увеличивает количество ошибок во время выполнения для вещей, которые можно было обнаружить во время компиляции.

Напротив, DataSet[T] печатается. когда вы это сделаете:

val people: People = val people = sqlContext.read.parquet("...").as[People]

Фактически вы возвращаете объект People, где deptId является фактическим интегральным типом, а не типом столбца, тем самым пользуясь системой типов.

Начиная с Spark 2.0, API-интерфейсы DataFrame и DataSet будут унифицированы, где DataFrame будет типом псевдонимов для DataSet[Row].

18
ответ дан 18 мая '16 в 16:39
источник

DataFrame эквивалентен таблице в СУБД, а также можно манипулировать аналогично "родным" распределенным коллекциям в RDD. В отличие от RDD, Dataframes отслеживает схему и поддерживает различные реляционные операции, которые приводят к более оптимизированному исполнению. Каждый объект DataFrame представляет собой логический план, но из-за их "ленивой" природы выполнение не выполняется до тех пор, пока пользователь не вызовет определенную "операцию вывода".

8
ответ дан 25 сент. '15 в 6:45
источник

Большинство ответов верны, только хотите добавить одну точку здесь

В Spark 2.0 два API (DataFrame + DataSet) будут объединены вместе в один API.

"Унификация DataFrame и набора данных: в Scala и Java, DataFrame и Dataset были унифицированы, то есть DataFrame - это просто псевдоним типа для набора данных из строки. В Python и R, учитывая отсутствие безопасности типов, DataFrame является основной программный интерфейс."

Наборы данных похожи на RDD, однако вместо использования сериализации Java или Kryo они используют специализированный Encoder для сериализации объектов для обработки или передачи по сети.

Spark SQL поддерживает два разных метода преобразования существующих RDD в Datasets. Первый метод использует отражение для вывода схемы RDD, которая содержит конкретные типы объектов. Этот подход, основанный на анализе, приводит к более сжатому коду и хорошо работает, когда вы уже знаете схему при написании приложения Spark.

Второй способ создания наборов данных - это программный интерфейс, который позволяет вам построить схему, а затем применить ее к существующему RDD. Хотя этот метод более подробен, он позволяет создавать наборы данных, когда столбцы и их типы неизвестны до времени выполнения.

Здесь вы можете найти ответ RDD tof Data​​p >

Как преобразовать объект rdd в dataframe в искру

8
ответ дан 20 нояб. '16 в 16:53
источник

A Dataframe - это RDD объектов Row, каждый из которых представляет запись. Dataframe также знает схему (т.е. Поля данных) своих строк. В то время как Dataframes выглядят как обычные RDD, внутренне они хранят данные более эффективным образом, используя их схему. Кроме того, они предоставляют новые операции, недоступные для RDD, такие как возможность запуска SQL-запросов. Данные могут создаваться из внешних источников данных, из результатов запросов или из обычных RDD.

Ссылка: Zaharia M., et al. Learning Spark (O'Reilly, 2015)

5
ответ дан 20 окт. '16 в 16:27
источник

Несколько соображений с точки зрения использования, RDD vs DataFrame:

  • RDD потрясающие! поскольку они дают нам всю гибкость для обработки практически любых данных; неструктурированные, полуструктурированные и структурированные данные. Поскольку, много раз данные не готовы вписываться в DataFrame (даже JSON), RDD можно использовать для предварительной обработки данных, чтобы он мог вставляться в фрейм данных. RDD - это основная абстракция данных в Spark.
  • Не все преобразования, которые возможны в RDD, возможны на DataFrames, пример subtract() для RDD vs except() для DataFrame.
  • Так как DataFrames подобны реляционной таблице, они следуют строгим правилам при использовании преобразований теории множеств/реляционных теорий, например, если вы хотите объединить два фрейма данных, требование состоит в том, чтобы оба dfs имели одинаковое количество столбцов и связанных типов данных столбцов. Имена столбцов могут быть разными. Эти правила не применяются к RDD. Вот хороший учебник, объясняющий эти факты.
  • При использовании DataFrames наблюдается повышение производительности, поскольку другие уже подробно объяснили.
  • Используя DataFrames, вам не нужно передавать произвольную функцию так же, как при программировании с помощью RDD.
  • Вам нужен SQLContext/HiveContext для программирования фреймов данных, поскольку они лежат в области SparkSQL искровой экосистемы, но для RDD вам нужен только SparkContext/JavaSparkContext, который находится в библиотеках Spark Core.
  • Вы можете создать df из RDD, если вы можете определить схему для него.
  • Вы также можете преобразовать df в rdd и rdd в df.

Надеюсь, это поможет!

4
ответ дан 26 авг. '17 в 0:10
источник

Вы можете использовать RDD со структурированными и неструктурированными, где, поскольку Dataframe/Dataset может обрабатывать только структурированные и полуструктурированные данные (имеет правильную схему)

1
ответ дан 07 дек. '17 в 9:51
источник

A DataFrame - это RDD, у которого есть схема. Вы можете рассматривать это как таблицу реляционных баз данных, поскольку каждый столбец имеет имя и известный тип. Сила DataFrames исходит из того факта, что при создании DataFrame из структурированного набора данных (Json, Parquet..) Spark может вывести схему, сделав проход по всему набору данных (Json, Parquet..), который загружается. Затем при вычислении плана выполнения Spark может использовать схему и существенно улучшить оптимизацию вычислений. Обратите внимание, что DataFrame назывался SchemaRDD до Spark v1.3.0

0
ответ дан 08 янв. '18 в 1:35
источник