Мне просто интересно, в чем разница между RDD
and и DataFrame
(Spark 2.0.0 DataFrame - просто псевдоним типа Dataset[Row]
) в Apache Spark?
Можете ли вы преобразовать одно в другое?
источник
Мне просто интересно, в чем разница между RDD
and и DataFrame
(Spark 2.0.0 DataFrame - просто псевдоним типа Dataset[Row]
) в Apache Spark?
Можете ли вы преобразовать одно в другое?
A DataFrame
определяется хорошо с поиском Google для «Определение DataFrame»:
Кадр данных представляет собой таблицу или двумерную массивоподобную структуру, в которой каждый столбец содержит измерения по одной переменной, а каждая строка содержит один случай.
Таким образом, a DataFrame
имеет дополнительные метаданные из-за своего табличного формата, который позволяет Spark выполнять определенные оптимизации для завершенного запроса.
RDD
, С другой стороны, это всего лишь R esilient D istributed D ataset , что в большей степени Blackbox данных , которые не могут быть оптимизированы , как операции , которые могут быть выполнены против него, не так ограничен.
Однако вы можете перейти от DataFrame к методу RDD
через его rdd
, и вы можете перейти от a RDD
к a DataFrame
(если RDD в табличном формате) через toDF
метод
В общем, рекомендуется использовать, DataFrame
где это возможно, благодаря встроенной оптимизации запросов.
Да .. преобразование между
Dataframe
иRDD
абсолютно возможно.Ниже приведены некоторые примеры кода.
df.rdd
являетсяRDD[Row]
Ниже приведены некоторые варианты создания фрейма данных.
1)
yourrddOffrow.toDF
конвертируется вDataFrame
.2) Использование
createDataFrame
контекста sqlval df = spark.createDataFrame(rddOfRow, schema)
На самом деле есть 3 API Apache Spark.
RDD
API:Пример СДР:
Пример: фильтр по атрибуту с помощью RDD
DataFrame
APIПример стиля SQL:
df.filter("age > 21");
Ограничения: поскольку код ссылается на атрибуты данных по имени, компилятор не может отловить какие-либо ошибки. Если имена атрибутов неверны, ошибка будет обнаружена только во время выполнения, когда создается план запроса.
Еще одним недостатком
DataFrame
API является то, что он очень ориентирован на скалы, и хотя он поддерживает Java, поддержка ограничена.Например, при создании
DataFrame
из существующегоRDD
объекта Java оптимизатор Spark Catalyst не может вывести схему и предполагает, что любые объекты в DataFrame реализуютscala.Product
интерфейс. Scalacase class
работает на коробке, потому что они реализуют этот интерфейс.Dataset
APIПример
Dataset
API-стиля SQL:Оценки разн. между
DataFrame
&DataSet
:Катализатор уровня потока. . (Демистификация презентации DataFrame и Dataset с искрового саммита)
Читать далее ... статья о блоке данных - Повесть о трех API-интерфейсах Apache Spark: СДР против фреймов данных и наборов данных
источник
df.filter("age > 21");
это можно оценить / проанализировать только во время выполнения. с его строки. Incase of Datasets, Datasets соответствуют требованиям bean. поэтому возраст - это свойство бобов. если в вашем bean-компоненте не указано свойство age, тогда вы узнаете об этом рано, т.е. во время компиляции (т.е.dataset.filter(_.age < 21);
). Ошибка анализа может быть переименована как Ошибка оценки.Apache Spark предоставляет три типа API
Вот сравнение API между RDD, Dataframe и Dataset.
РДД
Особенности СДР: -
Распределенная коллекция:
СДР использует операции MapReduce, которые широко применяются для обработки и создания больших наборов данных с параллельным распределенным алгоритмом в кластере. Это позволяет пользователям писать параллельные вычисления, используя набор операторов высокого уровня, не беспокоясь о распределении работы и отказоустойчивости.
Неизменные: СДР, состоящие из набора записей, которые разделены. Раздел - это базовая единица параллелизма в СДР, и каждый раздел - это одно логическое разделение данных, которое является неизменным и создается с помощью некоторых преобразований в существующих разделах. Неизменность помогает обеспечить согласованность вычислений.
Отказоустойчивость: в случае потери некоторого раздела RDD мы можем воспроизвести преобразование этого раздела в lineage для достижения того же вычисления, а не выполнять репликацию данных на нескольких узлах. Эта характеристика является наибольшим преимуществом RDD, поскольку она экономит много усилий в управлении данными и репликации и, следовательно, обеспечивает более быстрые вычисления.
Ленивые оценки: все преобразования в Spark являются ленивыми, поскольку они не сразу вычисляют свои результаты. Вместо этого они просто запоминают преобразования, примененные к некоторому базовому набору данных. Преобразования вычисляются только тогда, когда действие требует возврата результата в программу драйвера.
Функциональные преобразования: СДР поддерживают два типа операций: преобразования, которые создают новый набор данных из существующего, и действия, которые возвращают значение программе драйвера после выполнения вычисления в наборе данных.
Форматы обработки данных:
он может легко и эффективно обрабатывать как структурированные, так и неструктурированные данные.
Поддерживаемые языки программирования:
RDD API доступен в Java, Scala, Python и R.
Ограничения СДР: -
Нет встроенного механизма оптимизации: при работе со структурированными данными СДР не могут использовать преимущества передовых оптимизаторов Spark, включая оптимизатор катализаторов и механизм исполнения Tungsten. Разработчики должны оптимизировать каждый RDD на основе его атрибутов.
Обработка структурированных данных: в отличие от Dataframe и наборов данных, RDD не выводят схему загруженных данных и требуют от пользователя ее указания.
Dataframes
Spark представил Dataframes в выпуске Spark 1.3. Датафрейм преодолевает ключевые проблемы, с которыми сталкивались RDD.
Особенности Dataframe: -
Распределенная коллекция объекта Row: DataFrame - это распределенная коллекция данных, организованная в именованные столбцы. Концептуально это эквивалентно таблице в реляционной базе данных, но с более богатой оптимизацией.
Обработка данных: обработка структурированных и неструктурированных форматов данных (Avro, CSV, эластичный поиск и Cassandra) и систем хранения (HDFS, таблицы HIVE, MySQL и т. Д.). Он может читать и писать из всех этих различных источников данных.
Оптимизация с использованием оптимизатора катализатора: он поддерживает запросы SQL и API DataFrame. Структура данных использует структуру преобразования дерева катализаторов в четыре этапа,
Совместимость с Hive. Используя Spark SQL, вы можете запускать неизмененные запросы Hive на существующих складах Hive. Он повторно использует внешний интерфейс Hive и MetaStore и обеспечивает полную совместимость с существующими данными Hive, запросами и пользовательскими функциями.
Tungsten: Tungsten обеспечивает физический бэкэнд выполнения, который явно управляет памятью и динамически генерирует байт-код для оценки выражения.
Поддерживаемые языки программирования:
API Dataframe доступен в Java, Scala, Python и R.
Ограничения кадра данных: -
Пример:
Это особенно сложно, когда вы работаете с несколькими этапами преобразования и агрегирования.
Пример:
API наборов данных
Особенности набора данных: -
Обеспечивает лучшее как RDD, так и Dataframe: RDD (функциональное программирование, типобезопасность), DataFrame (реляционная модель, оптимизация запросов, выполнение вольфрама, сортировка и перемешивание)
Кодировщики. С помощью кодировщиков легко преобразовать любой объект JVM в набор данных, что позволяет пользователям работать как с структурированными, так и с неструктурированными данными в отличие от Dataframe.
Поддерживаемые языки программирования: API наборов данных в настоящее время доступен только в Scala и Java. Python и R в настоящее время не поддерживаются в версии 1.6. Поддержка Python намечена для версии 2.0.
Безопасность типов: API наборов данных обеспечивает безопасность времени компиляции, которая не была доступна в Dataframes. В приведенном ниже примере мы можем увидеть, как набор данных может работать с объектами домена с помощью компиляции лямбда-функций.
Пример:
Ограничение API наборов данных: -
Пример:
Отсутствует поддержка Python и R: Начиная с версии 1.6, наборы данных поддерживают только Scala и Java. Поддержка Python будет представлена в Spark 2.0.
API наборов данных имеет несколько преимуществ по сравнению с существующим API RDD и Dataframe, обеспечивая лучшую безопасность типов и функциональное программирование. С учетом требований к приведению типов в API вы все равно не будете обеспечивать требуемую безопасность типов и сделаете свой код хрупким.
источник
Dataset
не является LINQ и лямбда-выражение не может быть интерпретировано как деревья выражений. Таким образом, существуют черные ящики, и вы теряете почти все (если не все) преимущества оптимизатора. Небольшое подмножество возможных недостатков: Набор данных Spark 2.0 против DataFrame . Кроме того, просто чтобы повторить то, что я говорил несколько раз - в целом сквозная проверка типов невозможна сDataset
API. Объединения являются лишь наиболее ярким примером.Все (RDD, DataFrame и DataSet) в одной картинке.
кредиты изображения
RDD
DataFrame
Dataset
Nice comparison of all of them with a code snippet.
источник
Да, возможны оба
1.
RDD
чтобыDataFrame
с.toDF()
другие способы: преобразовать объект RDD в Dataframe в Spark
2.
DataFrame
/DataSet
сRDD
с.rdd()
методомисточник
Потому что
DataFrame
он слабо типизирован, и разработчики не получают преимуществ системы типов. Например, предположим, что вы хотите прочитать что-то из SQL и выполнить на нем агрегацию:Когда вы говорите
people("deptId")
, вы не получаете обратноInt
илиLong
, вы получаетеColumn
объект, с которым вам нужно работать. В языках с богатыми системами типов, таких как Scala, вы теряете всю безопасность типов, что увеличивает количество ошибок времени выполнения для вещей, которые могут быть обнаружены во время компиляции.Напротив,
DataSet[T]
набрано. когда вы делаете:Вы на самом деле возвращаете
People
объект, которыйdeptId
является фактическим целочисленным типом, а не типом столбца, таким образом, используя преимущества системы типов.Начиная с Spark 2.0, API-интерфейсы DataFrame и DataSet будут унифицированы, где
DataFrame
будет псевдоним типаDataSet[Row]
.источник
Dataframe
это просто псевдоним дляDataset[Row]
DataFrame
заключалась в том, чтобы не нарушать изменения API. Во всяком случае, просто хотел указать на это. Спасибо за редактирование и upvote от меня.Просто
RDD
является ключевым компонентом, ноDataFrame
это API, представленный в версии 1.30.РДД
Сбор данных разделов называется
RDD
. ОниRDD
должны следовать нескольким свойствам, таким как:Здесь
RDD
либо структурированные, либо неструктурированные.DataFrame
DataFrame
это API, доступный в Scala, Java, Python и R. Он позволяет обрабатывать любые типы структурированных и полуструктурированных данных. Чтобы определитьDataFrame
, коллекция распределенных данных, организованных в именованные столбцы называетсяDataFrame
. Вы можете легко оптимизироватьRDDs
вDataFrame
. Вы можете обрабатывать данные JSON, данные паркета, данные HiveQL одновременно, используяDataFrame
.Здесь Sample_DF считают как
DataFrame
.sampleRDD
называется (необработанные данные)RDD
.источник
Большинство ответов верны, хочу добавить только один балл
В Spark 2.0 два API (DataFrame + DataSet) будут объединены в единый API.
«Объединение DataFrame и Dataset: в Scala и Java DataFrame и Dataset были унифицированы, т.е. DataFrame - это просто псевдоним типа для Dataset of Row. В Python и R, учитывая отсутствие безопасности типов, DataFrame является основным интерфейсом программирования».
Наборы данных аналогичны RDD, однако вместо сериализации Java или Kryo они используют специализированный кодер для сериализации объектов для обработки или передачи по сети.
Spark SQL поддерживает два разных метода для преобразования существующих RDD в наборы данных. Первый метод использует отражение, чтобы вывести схему RDD, которая содержит определенные типы объектов. Этот основанный на отражении подход приводит к более лаконичному коду и хорошо работает, когда вы уже знаете схему при написании приложения Spark.
Второй метод создания наборов данных - через программный интерфейс, который позволяет создать схему и затем применить ее к существующему СДР. Хотя этот метод более многословен, он позволяет создавать наборы данных, когда столбцы и их типы неизвестны до времени выполнения.
Здесь вы можете найти ответ RDD на фрейм Data.
Как преобразовать объект rdd в dataframe в спарк
источник
DataFrame эквивалентен таблице в RDBMS и может также управляться аналогично «родным» распределенным коллекциям в RDD. В отличие от RDD, Dataframes отслеживают схему и поддерживают различные реляционные операции, которые ведут к более оптимизированному выполнению. Каждый объект DataFrame представляет логический план, но из-за своей «ленивой» природы выполнение не происходит, пока пользователь не вызовет определенную «операцию вывода».
источник
Несколько выводов с точки зрения использования, RDD vs DataFrame:
Я надеюсь, что это помогает!
источник
Dataframe - это RDD объектов Row, каждый из которых представляет запись. Dataframe также знает схему (т. Е. Полей данных) своих строк. Хотя датафреймы выглядят как обычные RDD, внутри они хранят данные более эффективно, используя преимущества своей схемы. Кроме того, они предоставляют новые операции, недоступные на RDD, такие как возможность выполнения запросов SQL. Кадры данных могут быть созданы из внешних источников данных, из результатов запросов или из обычных RDD.
Ссылка: Захария М. и соавт. Изучая Искру (О'Рейли, 2015)
источник
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
-источник
DataFrame является РДД , который имеет схему. Вы можете думать об этом как о таблице реляционной базы данных, в которой каждый столбец имеет имя и известный тип. Мощь DataFrames проистекает из того факта, что когда вы создаете DataFrame из структурированного набора данных (Json, Parquet ..), Spark может вывести схему, обойдя весь набор данных (Json, Parquet ..), который загружается. Затем, при расчете плана выполнения, Spark может использовать схему и существенно улучшить оптимизацию вычислений. Обратите внимание, что DataFrame назывался SchemaRDD до Spark v1.3.0
источник
Apache Spark - RDD, DataFrame и DataSet
Spark RDD -
Spark Dataframe -
Набор данных Spark -
источник
Вы можете использовать RDD со структурированным и неструктурированным, тогда как Dataframe / Dataset может обрабатывать только структурированные и полуструктурированные данные (они имеют правильную схему)
источник
Все отличные ответы и использование каждого API имеет некоторый компромисс. Набор данных построен как супер API для решения многих проблем, но много раз RDD по-прежнему работает лучше, если вы понимаете свои данные и если алгоритм обработки оптимизирован для выполнения многих задач за один проход для больших данных, тогда RDD кажется лучшим вариантом.
Агрегация с использованием API набора данных по-прежнему потребляет память и со временем будет улучшаться.
источник