Разница между DataFrame, Dataset и RDD в Spark
Мне просто интересно, какая разница между RDD
и DataFrame
(Spark 2.0.0 DataFrame - простой псевдоним типа для Dataset[Row]
) в Apache Spark?
Можете ли вы преобразовать один в другой?
Ответы
Ответ 1
A DataFrame
хорошо определен с поиском google для определения "DataFrame":
Кадр данных представляет собой таблицу или двухмерную структуру, подобную массиву, в каждый столбец содержит измерения по одной переменной, и каждая строка содержит один случай.
Таким образом, DataFrame
имеет дополнительные метаданные из-за своего табличного формата, что позволяет Spark выполнять определенные оптимизации по завершенному запросу.
An RDD
, с другой стороны, представляет собой просто R esilient D istributed D ataset, который больше представляет собой черный ящик данные, которые не могут быть оптимизированы как операции, которые могут быть выполнены против него, не так ограничены.
Однако вы можете перейти от DataFrame к RDD
с помощью метода RDD
, и вы можете перейти от RDD
к DataFrame
(если RDD находится в табличном формате) с помощью toDF
метод
Обычно рекомендуется использовать DataFrame
, где это возможно, из-за встроенной оптимизации запросов.
Ответ 2
Во-первых, DataFrame
была разработана из SchemaRDD
.
![depreated method toSchemaRDD]()
Да.. преобразование между Dataframe
и RDD
абсолютно возможно.
Ниже приведены примеры фрагментов кода.
Ниже приведены некоторые варианты создания фрейма данных.
-
1) yourrddOffrow.toDF
преобразуется в DataFrame
.
-
2) Использование createDataFrame
из sql-контекста
val df = spark.createDataFrame(rddOfRow, schema)
где схема может быть из некоторых вариантов ниже, как описано в хорошем посте SO..
Из класса случая Scala и API отражения Scala
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
как описано в 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]()
-
RDD
API:
API RDD
(Resilient Distributed Dataset) находится в Spark с версии 1.0.
RDD
API предоставляет множество методов преобразования, таких как map
(), filter
() и reduce
() для выполнения вычислений с данными. Каждый из этих методов приводит к новому RDD
представляющему преобразованные данные. Однако эти методы просто определяют операции, которые должны быть выполнены, и преобразования не выполняются, пока не будет вызван метод действия. Примерами методов действий являются collect
() и saveAsObjectFile
().
Пример СДР:
rdd.filter(_.age > 21) // transformation
.map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action
Пример: фильтрация по атрибуту с помощью RDD
rdd.filter(_.age > 21)
-
API DataFrame
Spark 1.3 представил новый API DataFrame
в рамках инициативы Project Tungsten, которая направлена на повышение производительности и масштабируемости Spark. API DataFrame
представляет концепцию схемы для описания данных, позволяя Spark управлять схемой и передавать данные только между узлами гораздо более эффективным способом, чем при использовании сериализации Java.
API DataFrame
кардинально отличается от API RDD
поскольку это API для построения плана реляционных запросов, который затем может выполнить оптимизатор Sparks Catalyst. API является естественным для разработчиков, которые знакомы с построением планов запросов
Пример стиля SQL:
df.filter("age > 21");
Ограничения: поскольку код ссылается на атрибуты данных по имени, компилятор не может отследить какие-либо ошибки. Если имена атрибутов неверны, ошибка будет обнаружена только во время выполнения, когда создается план запроса.
Еще одним недостатком API DataFrame
является то, что он очень ориентирован на DataFrame
и хотя он поддерживает Java, поддержка ограничена.
Например, при создании DataFrame
из существующего RDD
Java-объектов оптимизатор Sparks Catalyst не может вывести схему и предполагает, что любые объекты в DataFrame реализуют интерфейс scala.Product
. case class
Scala работает, потому что они реализуют этот интерфейс.
-
API Dataset
API Dataset
, выпущенный как предварительный просмотр API в Spark 1.6, призван обеспечить лучшее из обоих миров; знакомый объектно-ориентированный стиль программирования и безопасность типов во время компиляции API RDD
но с преимуществами производительности оптимизатора запросов Catalyst. Наборы данных также используют тот же эффективный механизм хранения вне кучи, что и API DataFrame
.
Когда дело доходит до сериализации данных, API Dataset
имеет концепцию кодеров, которые преобразуют между представлениями (объектами) JVM и внутренним двоичным форматом Sparks. Spark имеет встроенные кодеры, которые очень продвинуты в том, что они генерируют байт-код для взаимодействия с данными вне кучи и предоставляют доступ по требованию к отдельным атрибутам без необходимости десериализации всего объекта. Spark пока не предоставляет API для реализации пользовательских кодеров, но это планируется в будущем выпуске.
Кроме того, API Dataset
разработан для одинаковой работы как с Java, так и с Scala. При работе с объектами Java важно, чтобы они были полностью совместимы с компонентами.
Пример API Dataset
стиле SQL:
dataset.filter(_.age < 21);
Оценки разн. между DataFrame
и DataSet
: ![enter image description here]()
Читать далее... статья о блоке данных - Повесть о трех API-интерфейсах Apache Spark: СДР против фреймов данных и наборов данных
Ответ 3
Apache Spark предоставляет три типа API
![Сравнение 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 вы все равно не будете требовать безопасности типа и сделаете ваш код хрупким.
Ответ 4
РДД
Основная абстракция 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 вы все равно не будете требовать безопасности типа и сделаете ваш код хрупким.
Ответ 5
Все (RDD, DataFrame и DataSet) в одном изображении.
![RDD vs DataFrame vs DataSet]()
кредиты изображения
RDD
RDD
представляет собой отказоустойчивый набор элементов, которые могут работать параллельно.
DataFrame
DataFrame
- это набор данных, организованный в именованные столбцы. это концептуально эквивалентно таблице в реляционной базе данных или данным кадр в R/Python, , но с большим количеством оптимизаций под капотом.
Dataset
Dataset
представляет собой распределенный сбор данных. Набор данных - это новый интерфейс, добавленный в Spark 1.6, который обеспечивает преимущества СДР(строгая типизация, возможность использовать мощные лямбда-функции) с преимущества оптимизированного механизма исполнения Spark SQL.
Note:
Dataset of Rows (Dataset[Row]
) in Scala/Java will often refer as DataFrames.
Nice comparison of all of them with a code snippet.
![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
- RDD
методом .rdd()
val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD
Ответ 6
Просто 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
.
Ответ 7
Поскольку 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]
.
Ответ 8
Большинство ответов верны, только хотите добавить одну точку здесь
В 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 Datap >
Как преобразовать объект rdd в dataframe в искру
Ответ 9
DataFrame эквивалентен таблице в СУБД, а также можно манипулировать аналогично "родным" распределенным коллекциям в RDD. В отличие от RDD, Dataframes отслеживает схему и поддерживает различные реляционные операции, которые приводят к более оптимизированному исполнению.
Каждый объект DataFrame представляет собой логический план, но из-за их "ленивой" природы выполнение не выполняется до тех пор, пока пользователь не вызовет определенную "операцию вывода".
Ответ 10
A Dataframe - это RDD объектов Row, каждый из которых представляет запись.
Dataframe также знает схему (т.е. Поля данных) своих строк. В то время как Dataframes
выглядят как обычные RDD, внутренне они хранят данные более эффективным образом, используя их схему. Кроме того, они предоставляют новые операции, недоступные для RDD, такие как возможность запуска SQL-запросов. Данные могут создаваться из внешних источников данных, из результатов запросов или из обычных RDD.
Ссылка: Zaharia M., et al. Learning Spark (O'Reilly, 2015)
Ответ 11
Немного понимания с точки зрения использования, СДР против DataFrame:
- СДР потрясающие! поскольку они дают нам всю гибкость, чтобы иметь дело с почти любым видом данных; неструктурированные, полуструктурированные и структурированные данные. Поскольку данные часто не готовы помещаться в DataFrame (даже в JSON), RDD можно использовать для предварительной обработки данных, чтобы они могли помещаться в информационный кадр. СДР являются основной абстракцией данных в Spark.
- Не все преобразования, которые возможны в RDD, возможны в DataFrames, пример subtract() - для RDD, кроме() - для DataFrame.
- Поскольку DataFrames похожи на реляционную таблицу, они следуют строгим правилам при использовании преобразований теории множеств/реляционной теории, например, если вы хотите объединить два кадра данных, необходимо, чтобы оба df имели одинаковое количество столбцов и связанные типы данных столбцов. Имена столбцов могут быть разными. Эти правила не применяются к СДР. Вот хороший учебник, объясняющий эти факты.
- При использовании DataFrames наблюдается повышение производительности, о чем другие уже подробно рассказывали.
- Используя DataFrames, вам не нужно передавать произвольную функцию, как при программировании с помощью RDD.
- Вам нужен SQLContext/HiveContext для программирования фреймов данных, так как они находятся в области SparkSQL в экосистеме искры, но для RDD вам нужен только SparkContext/JavaSparkContext, который находится в библиотеках Spark Core.
- Вы можете создать df из RDD, если можете определить схему для него.
- Вы также можете преобразовать df в rdd и rdd в df.
Я надеюсь, что это помогает!
Ответ 12
Вы можете использовать RDD со структурированными и неструктурированными, где, поскольку Dataframe/Dataset может обрабатывать только структурированные и полуструктурированные данные (имеет правильную схему)
Ответ 13
Spark RDD (resilient distributed dataset)
:
RDD является основным API абстракции данных и доступен с самого первого выпуска Spark (Spark 1.0). Это низкоуровневый API для управления распределенным сбором данных. API RDD предоставляет некоторые чрезвычайно полезные методы, которые можно использовать для получения очень жесткого контроля над базовой физической структурой данных. Это неизменяемая (только для чтения) коллекция разделенных данных, распределенных на разных компьютерах. RDD позволяет выполнять вычисления в памяти на больших кластерах, чтобы ускорить обработку больших данных отказоустойчивым способом. Для обеспечения отказоустойчивости СДР использует DAG (направленный ациклический граф), который состоит из набора вершин и ребер. Вершины и ребра в DAG представляют RDD и операцию, которая должна применяться к этому RDD соответственно. Преобразования, определенные в RDD, являются ленивыми и выполняются только при вызове действия.
Spark DataFrame
:
Spark 1.3 представил два новых API абстракции данных - DataFrame и DataSet. API DataFrame организуют данные в именованные столбцы, например, таблицы в реляционной базе данных. Это позволяет программистам определять схему для распределенного сбора данных. Каждая строка в DataFrame имеет строку типа объекта. Как и таблица SQL, каждый столбец должен иметь одинаковое количество строк в DataFrame. Короче говоря, DataFrame - это лениво оцененный план, который определяет операции, которые необходимо выполнить с распределенным сбором данных. DataFrame также является неизменной коллекцией.
Spark DataSet
:
В качестве расширения API DataFrame Spark 1.3 также представил API DataSet, который предоставляет строго типизированный и объектно-ориентированный интерфейс программирования в Spark. Это неизменный, безопасный тип распределенных данных. Как и DataFrame, API-интерфейсы DataSet также используют механизм Catalyst для обеспечения оптимизации выполнения. DataSet является расширением API DataFrame.
Other Differences
-
![enter image description here]()
Ответ 14
A DataFrame - это RDD, у которого есть схема. Вы можете рассматривать это как таблицу реляционных баз данных, поскольку каждый столбец имеет имя и известный тип. Сила DataFrames исходит из того факта, что при создании DataFrame из структурированного набора данных (Json, Parquet..) Spark может вывести схему, сделав проход по всему набору данных (Json, Parquet..), который загружается. Затем при вычислении плана выполнения Spark может использовать схему и существенно улучшить оптимизацию вычислений.
Обратите внимание, что DataFrame назывался SchemaRDD до Spark v1.3.0
Ответ 15
Все отличные ответы и использование каждого API имеет некоторый компромисс. Набор данных построен как супер API для решения многих проблем, но много раз RDD по-прежнему работает лучше, если вы понимаете свои данные и если алгоритм обработки оптимизирован для выполнения многих задач за один проход для больших данных, тогда RDD кажется лучшим вариантом.
Агрегация с использованием API набора данных по-прежнему потребляет память и со временем будет улучшаться.