Датасет и датафрейм в чем разница

Датасет и датафрейм в чем разница

В прошлый раз мы рассмотрели понятия датафрейм (DataFrame), датасет (DataSet) и RDD в контексте интерактивной аналитики больших данных (Big Data) с помощью Spark SQL. Сегодня поговорим подробнее, чем отличаются эти структуры данных, сравнив их по разным характеристикам: от времени возникновения до специфики вычислений.

Критерии для сравнения структур данных Apache Spark

Прежде всего, определим, по каким параметрам мы будем сравнивать DataFrame, DataSet и RDD. Для этого выделим несколько точек зрения:

Перед тем, как приступить к сравнению RDD, DataFrame и DataSet по вышеперечисленным критериям, отметим разный порядок появления этих структур данных в Apache Spark [1]:

Стоит также сказать, что, начиная с релиза 2.0 (2016 г.), DataSet API можно рассматривать с 2-х позиций: строго типизированный и нетипизированный. Таким образом, концептуально DataFrame является коллекцией универсальных объектов DataSet[Row], где Row — это универсальный нетипизированный JVM-объект. DataSet, напротив, представляет собой набор строго типизированных объектов JVM, определяемых классом в Scala или Java [2].

2 типа API Dataset в Apache Spark

Данные в RDD, DataFrame и DataSet: представления, форматы и схемы

Начнем с представления данных [1]:

RDD, DataFrame и DataSet по-разному используют схемы данных [1]:

Хронология появления API Apache Spark

Как реализуются вычисления в Apache Spark

Напомним, сериализация представляет собой процесс перевода данных из формата — структуры, семантически понятной человеку, в двоичное представление для машинной обработки [3]. Это необходимо для хранения объекта на диске или в памяти и его передаче по сети. В этом отношении рассматриваемые структуры данных Apache Spark также отличаются друг от друга:

Таким образом, из-за особенностей сериализации, датасет, датафрейм и распределенная коллекция данных по-разному потребляют память: DataFrame и DataSet обрабатываются быстрее, чем RDD. Это сказывается и при выполнении простых операций группировки и агрегирования. В частности, API RDD выполняет их медленнее. Из-за этого DataFrame оптимально использовать для генерации агрегированной статистики для больших наборов данных, а DataSet — для быстрого выполнения операций агрегации на множестве массивов Big Data [1]. Такая ситуация обусловлена тем, что API-интерфейсы DataFrame и Dataset построены на основе движка Spark SQL, который использует Catalyst для создания оптимизированного логического и физического плана запросов. В этих API-интерфейсах для R, Java, Scala или Python все запросы типов отношений подвергаются одному и тому же оптимизатору кода, обеспечивая эффективность использования пространства и скорости. При том, что строго типизированный API Dataset оптимизирован для задач разработки, нетипизированный набор данных (DataFrame) обрабатывается еще быстрее и подходит для интерактивного анализа [2]. Подробнее про оптимизацию и другую специфику, важную с точки зрения Big Data разработчика, мы поговорим в нашей следующей статье. А о самом SQL-оптимизаторе Catalyst мы рассказываем здесь.

Наконец, поговорим про отложенные (ленивые) вычисления, которые откладываются до тех пор, пока не понадобится их результат. Эти операции реализуются с RDD, DataFrame и DataSet практически одинаково. Например, при работе с RDD результат вычисляется не сразу — вместо этого просто запоминается преобразование, примененное к некоторому базовому набору данных. А само преобразование Spark выполняет только тогда, когда для действия необходимо отправить результат. В DataFrame и DataSet вычисления происходят только тогда, когда появляется действие, к примеру, результат отображения, сохранение вывода [1].

Отложенные (ленивые) вычисления Apache Spark на примере RDD

Читайте в нашей следующей статье про разницу RDD, DataFrame и DataSet с точки зрения разработчика. А все необходимые знания и реальный опыт прикладной работы с этими структурами больших данных вы приобретете на нашем практическом курсе SPARK2: Анализ данных с Apache Spark в лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов (менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data) в Москве.

RDD, DataFrame и DataSet с точки зрения программиста Apache Spark: в чем разница

Продолжая говорить о сходствах и отличиях структур данных Apache Spark, сегодня мы рассмотрим, чем похожи датафрейм (DataFrame), датасет (DataSet) и RDD с позиции разработчика Big Data. Читайте в нашей статье, как обеспечивается оптимизация кода, безопасность типов при компиляции и прочие аспекты, важные при разработке распределенных программ и интерактивной аналитике больших данных с помощью Spark SQL.

Сравнение RDD, DataFrame и DataSet с позиции разработчика Big Data

Прежде всего перечислим, какие именно аспекты разработки программного обеспечения мы будем учитывать при сравнении структур данных Apache Spark:

Начнем с языков программирования: API-интерфейсы RDD и DataFrame доступны в Java, Scala, Python и R. А Dataset API поддерживается только в Scala and Java. Apache Spark 2.1.1 не поддерживает Python и R. Также рассматриваемые структуры данных Apache Spark существенно отличаются друг от друга в плане безопасности типов при компиляции [1]:

Рассматривая статическую типизацию и безопасность во время выполнения (Run ) и во время компиляции (Compile ), можно к сравнению DataSet и DataFrame также добавить SQL-запрос. Например, в строковых SQL-запросах Spark не сообщит о синтаксической ошибке до времени выполнения, тогда как в DataFrame и Dataset можно отловить их во время компиляции, что существенно экономит время разработчика Big Data. В частности, при вызове функции в DataFrame, которая не является частью API, компилятор ее перехватит. Однако, как мы отметили раньше, он не обнаружит несуществующее имя столбца до выполнения программы [2].

Благодаря строгой типизации DataSet, когда данные представлены как типизированные JVM-объекты, а API-процедуры выражаются как лямбда-функции, любое несоответствие типов будет обнаружено во время компиляции. Помимо синтаксических ошибок, DataSet API может обнаружить аналитическую ошибку во время компиляции, например, дублирование функций, что также облегчает работу программиста, экономя его время. Таким образом, DataSet за счет своих строгих ограничений повышает продуктивность разработчика, не позволяя тому совершать некоторые типичные ошибки [2].

Ошибки во время выполнения и компиляции программ в Spark SQL

Как поддерживается оптимизация, неизменность и совместимость структур данных Apache Spark

Встроенный механизм оптимизации недоступен в RDD, поэтому при работе со структурированными данными API распределенных коллекций не могут использовать преимущества оптимизаторов Apache Spark (CataLyst и Tungsten). Разработчик Big Data оптимизирует каждый RDD на основе его атрибутов. В DataFrame оптимизация кода выполняется с помощью оптимизатора CataLyst в 4 этапа:

DataSet включает в себя концепцию оптимизатора Catalyst для оптимизации плана запросов. Подробнее об SQL-оптимизаторе Catalyst мы рассказываем здесь.

SQL-оптимизация в Apache Spark

С точки зрения неизменности (Immutability) и совместимости (Interoperability) данных рассматриваемые структуры данных Apache Spark также ведут себя по-разному [1]:

Наконец, поговорим о сборке мусора (Garbage Collection) Для автоматического управления памятью за счет удаления неиспользуемых объектов [3]. В RDD накладные расходы на сборку мусора возникают в результате создания и уничтожения отдельных объектов. DataFrame позволяет избежать затрат на сборку мусора при создании отдельных объектов для каждой строки в наборе данных. При работе с DataSet автоматическому сборщику мусора также не нужно уничтожать объект, потому что сериализация проходит с помощью инструмента Tungsten, который явно управляет памятью и динамически генерирует байт-код для оценки выражений [4]. Благодаря динамической генерации байт-кода с сериализованными данными можно выполнить много операций, не требуя десериализации всего объекта [1].

Сравнение скорости выполнения SQL-запросов на разных структурах данных в Apache Spark

В каком именно случае стоит выбирать между RDD, DataFrame и DataSet и почему, читайте в нашей следующей статье — реальные примеры (use cases). А как работать со всеми этим структурами больших данных на практике вы узнаете в нашем прикладном курсе SPARK2: Анализ данных с Apache Spark в лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов (менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data) в Москве.

Что лучше: RDD, DataFrame или DataSet и почему – выбор структуры данных Apache Spark

Завершая сравнение структур данных Apache Spark, сегодня мы рассмотрим, в каких случаях разработчику Big Data стоит выбирать датафрейм (DataFrame), датасет (DataSet) или RDD и почему. Также мы приведем практический примеры и сценарии использования (use cases) этих программных абстракций, важных при разработке систем и сервисов по интерактивной аналитике больших данных с помощью Spark SQL.

Кэширование разных структур данных Apache Spark

Прежде чем перейти к обоснованию выбора той или иной структуры данных Apache Spark, рассмотрим, как выполняется их кэширование, т.к. это влияет на процесс их использования. Мы уже отмечали, что из-за особенностей сериализации распределенные коллекции данных (RDD) обрабатываются медленнее табличных наборов данных (DataFrame и DataSet). Поэтому для ускорения работы с RDD имеет смысл кэшировать данные в следующих случаях [1]:

Как правило, RDD кэшируется с помощью алгоритмов LRU (Least recently used), когда в первую очередь вытесняется элемент, неиспользованный дольше всех. Это происходит каждый раз, когда возникает нагрузка на память. При этом стоит выбирать следующие варианты кэширования [1]:

Подобной проблемы выбора параметров кэширования не возникает при работе DataSet и DataFrame благодаря Tungsten, который явно управляет памятью и динамически генерирует байт-код для оценки выражений. Из-за динамической генерации байт-кода с сериализованными данными можно проводить различные операции, не выполняя десериализации всего объекта [2]. Например, при работе со счетчиками или ассоциативными массивами [1].

RDD vs DataFrame vs DataSet c позиции разработки в Apache Spark

Когда и что использовать: выбор между RDD, DataFrame и DataSet

Учитывая ранее описанную специфику разных структур данных Apache Spark, важных с точки зрения разработчика Big Data программ, можно выделить следующие сценарии использования (use cases) для RDD, DataFrame и DataSet.

Итак, работать с RDD целесообразно, если [3]:

В свою очередь, концепции DataSet и DataFrame рационально использовать в следующих случаях [3]:

Стоит работать с Dataset, если необходимо получить более высокую степень безопасности типов во время компиляции, иметь типизированные JVM-объекты, а также использовать преимущества оптимизации Catalyst и эффективную генерацию кода в Tungsten. Именно эту структуру данных лучше всего использовать при работе с информацией в сложных предметных областях, например, финансы или телекоммуникации, когда необходимо оперировать с множеством объектов, выполняя над ними сложные бизнес-операции [1]. Подробнее об SQL-оптимизаторе Catalyst мы рассказываем здесь.

Таким образом, выбирая между структурами данных Apache Spark, следует помнить, что RDD предлагает низкоуровневую функциональность и контроль, а DataSet и DataFrame позволяют настраивать вид и структуру, предлагая высокоуровневые и специфичные для домена операции с экономией места на диске и в памяти [3].

Сравнение RDD, DataFrame и DataSet по характеристикам с точки зрения разработчика Big Data

В следующей статье мы расскажем подробнее о работе оптимизатора Apache Spark SQL — Catalyst. А получить реальный опыт прикладной работы с этим фреймворком интерактивной аналитики больших данных вы сможете на нашем практическом курсе SPARK2: Анализ данных с Apache Spark в лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов (менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data) в Москве.

Источник

Русские Блоги

Сравнение RDD, DataFrame и DataSet

общность:

2. Все три имеют ленивый механизм. При создании и преобразовании, например методов карты, они не будут выполняться немедленно. Только при обнаружении Action, такого как foreach, все три начнут операции обхода. В крайних случаях, если есть Создать и преобразовать, но соответствующий результат не используется в действии позже, он будет пропущен непосредственно во время выполнения, например

println («запустить») на карте не запускается

3. Эти три будут автоматически кэшировать операции в соответствии с ситуацией с памятью искры, так что даже если объем данных большой, нет необходимости беспокоиться о переполнении памяти.

4. Все три имеют концепцию разделения, например

Таким образом, работа с каждым разделом аналогична работе с массивом. Не только объем данных относительно невелик, но и результат операции на карте может быть легко извлечен. Если вы используете карту напрямую, внешняя операция на карте недействительна. Такие как

Когда раздел не используется, операции, отличные от map, не могут влиять на другие переменные, кроме map

5. У всех трех есть много общих функций, таких как фильтрация, сортировка и т. Д.

6. Для многих операций с DataFrame и Dataset этот пакет должен поддерживать

7. Как DataFrame, так и Dataset могут использовать сопоставление с образцом для получения значения и типа каждого поля.

Чтобы повысить надежность, лучше всего иметь операцию с подстановочными знаками, вот метод для анализа поля DataFrame

различия:

1. RDD обычно используется одновременно с Spark mlib

2. RDD не поддерживает операции sparksql.

DataFrame:

1. В отличие от RDD и Dataset, тип каждой строки DataFrame фиксируется на Row, и значение каждого поля может быть получено только путем синтаксического анализа, например

Значение каждого столбца не может быть доступно напрямую

2. DataFrame и Dataset обычно используются одновременно с Spark ml.

3. И DataFrame, и набор данных поддерживают операции sparksql, такие как select, groupby и т. Д., А также регистрируют временные таблицы / окна и выполняют операции операторов SQL, такие как

4. DataFrame и Dataset поддерживают некоторые особенно удобные методы хранения, такие как сохранение в формате csv, вы можете перенести заголовок, чтобы имя поля каждого столбца было понятным с первого взгляда.

Используя этот метод сохранения, вы можете легко получить соответствие между именем поля и столбцом, а разделитель можно свободно указать

Dataset:

Вот сравнение между Dataset и DataFrame, поскольку Dataset и DataFrame имеют точно такую ​​же функцию-член, разница только в типе данных каждой строки

В наборе данных тип каждой строки не определен. После настройки класса дела можно свободно получить информацию о каждой строке.

Видно, что набор данных очень удобен, когда вам нужно получить доступ к полю в столбце. Однако, если вы хотите написать несколько легко адаптируемых функций, если вы используете набор данных, тип строки является неопределенным и может быть различным. Класс случая, адаптация не может быть достигнута, в настоящее время использование DataFrame или Dataset [Row] может решить проблему лучше

Конверсия:

RDD, DataFrame и Dataset имеют много общего, и их соответствующие применимые сценарии часто необходимо преобразовывать между тремя

DataFrame / Dataset в RDD:

Это преобразование простое

RDD в DataFrame:

Обычно используйте кортежи для записи данных строки вместе, а затем укажите имя поля в toDF

СДР в набор данных:

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

Набор данных в DataFrame:

Это также очень просто, потому что он просто инкапсулирует класс case в Row

DataFrame в набор данных:

обращать внимание:

При использовании некоторых специальных операций необходимо добавить import spark.implicits._ В противном случае нельзя использовать toDF и toDS.

DataFrame

DataFrame представляет схему и вне кучи

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

Off-heap: означает память вне кучи JVM, которая напрямую управляется операционной системой (а не JVM). Spark может сериализовать данные (за исключением структуры) в память вне кучи в двоичной форме. Когда данные нужно манипулировать, он напрямую манипулирует памятью вне кучи. Поскольку Spark понимает схему, он знает, как работать.

Off-heap похож на территорию, схема похожа на карту, у Spark есть карта и собственная территория, вы можете сделать это самостоятельно, больше не ограничиваясь JVM и больше не страдая от GC.

Благодаря схеме и не кучей DataFrame устраняет недостатки RDD, но теряет преимущества RDD. DataFrame не является типобезопасным, а API не является объектно-ориентированным.

DataSet

DataSet сочетает в себе преимущества RDD и DataFrame и предлагает новую концепцию Encoder.

При сериализации данных Encoder генерирует байт-код для взаимодействия с off-heap, что позволяет добиться эффекта доступа к данным по запросу без десериализации всего объекта. Spark не предоставил пользовательский API Encoder, но он будет добавлен в будущем.

Давайте посмотрим на реализацию DataFrame и DataSet в версии 2.0.0-preview

Следующий фрагмент кода создает DataFrame в 1.6.x

Но тот же код был создан в 2.0.0-превью, хотя он все еще называется DataFrame.

Но на самом деле это DataSet, потому что DataFrame объявлен как Dataset [Row]

Поэтому при переходе с 1.6.x на 2.0.0 мы напрямую использовали DataSet без каких-либо изменений.

Ниже приведен пример кода DataSet.

RDD и DataFrame

Датасет и датафрейм в чем разница. Смотреть фото Датасет и датафрейм в чем разница. Смотреть картинку Датасет и датафрейм в чем разница. Картинка про Датасет и датафрейм в чем разница. Фото Датасет и датафрейм в чем разница

Повышение эффективности выполнения

RDD API является функциональным и подчеркивает неизменность. В большинстве сценариев он имеет тенденцию создавать новые объекты, а не изменять старые объекты. Хотя эта функция предоставляет чистый и аккуратный API, она также заставляет приложения Spark создавать большое количество временных объектов во время выполнения, что вызывает нагрузку на сборщик мусора. На основе существующего API RDD мы, безусловно, можем использовать метод mapPartitions для перезагрузки метода создания данных в одном фрагменте RDD и повторно использовать объекты переменных, чтобы уменьшить накладные расходы на выделение объектов и сборку мусора, но это приносит в жертву Чтобы улучшить читаемость кода и потребовать от разработчиков определенного понимания механизма выполнения Spark, порог является высоким. С другой стороны, Spark SQL пытается повторно использовать объекты во всех возможных ситуациях в рамках фреймворка.Хотя это нарушит неизменяемость внутри, когда данные возвращаются пользователю, они снова будут преобразованы в неизменяемые данные. Используйте DataFrame API для разработки, вы можете пользоваться этими эффектами оптимизации бесплатно.

Уменьшить чтение данных

Кроме того, Spark SQL также может в полной мере использовать преимущества столбчатых форматов хранения, таких как RCFile, ORC и Parquet, для сканирования только столбцов, фактически участвующих в запросе, и игнорирования данных в остальных столбцах.

Выполните оптимизацию

Датасет и датафрейм в чем разница. Смотреть фото Датасет и датафрейм в чем разница. Смотреть картинку Датасет и датафрейм в чем разница. Картинка про Датасет и датафрейм в чем разница. Фото Датасет и датафрейм в чем разница

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

Для обычных разработчиков значение оптимизатора запросов состоит в том, что даже неоптимальные запросы, написанные менее опытными программистами, могут быть максимально преобразованы в эффективные формы для выполнения.

RDD и DataSet

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

Для создания DataSet требуется явный кодировщик для сериализации объекта в двоичный, а схему объекта можно сопоставить с Spark.
SQl, но RDD зависит от механизма отражения времени выполнения.

Благодаря двум вышеупомянутым пунктам производительность DataSet намного выше, чем у RDD, вы можете обратиться к [3]

DataFrame и DataSet

Набор данных можно рассматривать как частный случай DataFrame.Основное отличие состоит в том, что каждая запись набора данных хранит строго типизированное значение вместо строки. Следовательно, он имеет следующие три характеристики:

DataSet может проверять тип во время компиляции

И это объектно-ориентированный программный интерфейс. Пример с количеством слов:

Источник

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

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

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

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

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

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

Датасет и датафрейм в чем разница. Смотреть фото Датасет и датафрейм в чем разница. Смотреть картинку Датасет и датафрейм в чем разница. Картинка про Датасет и датафрейм в чем разница. Фото Датасет и датафрейм в чем разница

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

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

Ниже приведены некоторые варианты создания фрейма данных.

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

val df = spark.createDataFrame(rddOfRow, schema)

где схема может быть из некоторых вариантов ниже, как описано в хорошем посте SO..
Из класса случая Scala и API отражения Scala

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

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

Датасет и датафрейм в чем разница. Смотреть фото Датасет и датафрейм в чем разница. Смотреть картинку Датасет и датафрейм в чем разница. Картинка про Датасет и датафрейм в чем разница. Фото Датасет и датафрейм в чем разница

Датасет и датафрейм в чем разница. Смотреть фото Датасет и датафрейм в чем разница. Смотреть картинку Датасет и датафрейм в чем разница. Картинка про Датасет и датафрейм в чем разница. Фото Датасет и датафрейм в чем разница

RDD API:

API RDD (Resilient Distributed Dataset) находится в Spark с версии 1.0.

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

Пример СДР:

Пример: фильтрация по атрибуту с помощью RDD

API DataFrame

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

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

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

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

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

API Dataset

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

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

Пример API Dataset стиле SQL:

Оценки разн. между DataFrame и DataSet : Датасет и датафрейм в чем разница. Смотреть фото Датасет и датафрейм в чем разница. Смотреть картинку Датасет и датафрейм в чем разница. Картинка про Датасет и датафрейм в чем разница. Фото Датасет и датафрейм в чем разница

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

Датасет и датафрейм в чем разница. Смотреть фото Датасет и датафрейм в чем разница. Смотреть картинку Датасет и датафрейм в чем разница. Картинка про Датасет и датафрейм в чем разница. Фото Датасет и датафрейм в чем разница

Вот сравнение 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 использует структуру трансформации дерева катализатора в четыре фазы,

Совместимость улья:Используя Spark SQL, вы можете запускать немодифицированные запросы Hive на существующих складах Hive. Он повторно использует интерфейс “Привет” и MetaStore и дает вам полную совместимость с существующими данными, запросами и UDF для Hive.

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

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

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

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

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 может работать с объектами домена с компилируемыми лямбда-функциями.

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

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

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

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

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

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

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

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

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

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

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

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

Ограничения 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 использует структуру трансформации дерева катализатора в четыре фазы,

Совместимость улья:
Используя Spark SQL, вы можете запускать немодифицированные запросы Hive на существующих складах Hive. Он повторно использует интерфейс “Привет” и MetaStore и дает вам полную совместимость с существующими данными, запросами и UDF для Hive.

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

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

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

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

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 может работать с объектами домена с компилируемыми лямбда-функциями.

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

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

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

Все (RDD, DataFrame и DataSet) в одном изображении.

Датасет и датафрейм в чем разница. Смотреть фото Датасет и датафрейм в чем разница. Смотреть картинку Датасет и датафрейм в чем разница. Картинка про Датасет и датафрейм в чем разница. Фото Датасет и датафрейм в чем разница

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, в DataFrame или наоборот?

Да, возможны оба варианта

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

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

DataFrame

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

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

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

В 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 >

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

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

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

Немного понимания с точки зрения использования, СДР против DataFrame:

Я надеюсь, что это помогает!

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

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

Датасет и датафрейм в чем разница. Смотреть фото Датасет и датафрейм в чем разница. Смотреть картинку Датасет и датафрейм в чем разница. Картинка про Датасет и датафрейм в чем разница. Фото Датасет и датафрейм в чем разница

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

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

Агрегация с использованием API набора данных по-прежнему потребляет память и со временем будет улучшаться.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *