Різниця між DataFrame, набором даних та RDD в Spark


Відповіді:


232

A DataFrameдобре визначено з пошуковим пошуком Google для "визначення DataFrame":

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

Отже, a DataFrameмає додаткові метадані завдяки своєму табличному формату, що дозволяє Spark запускати певні оптимізації за остаточним запитом.

RDD, З іншого боку, це всього лише R esilient D istributed D ataset , що в більшій мірі Blackbox даних , які не можуть бути оптимізовані , як операції , які можуть бути виконані проти нього, не так обмежений.

Однак ви можете перейти від DataFrame до RDDvia через його rddметод, а ви можете перейти від a RDDдо a DataFrame(якщо RDD у табличному форматі) за допомогою toDFметоду

Загалом рекомендується використовувати, DataFrameде це можливо, завдяки вбудованій оптимізації запитів.


6
Відповідь не дає пояснення щодо наборів даних. Відповідно до Spark- The Definitive Guide, набір даних - це безпечно структурований api тип. Таким чином, ви можете заздалегідь надати тип вашої схеми.
Чінтан Пандія

3
Дякую - оригінальну назву та опис було відредаговано добре після оригінальних запитань (які не включали набори даних)
Джастін Піхоні

219

Перше, що DataFrameбуло розвинене з SchemaRDD.

застарілий метод toSchemaRDD

Так .. конверсія між Dataframeі RDDабсолютно можлива.

Нижче наведено кілька фрагментів зразкового коду.

  • df.rdd є RDD[Row]

Нижче наведено кілька варіантів створення фрейму даних.

  • 1) yourrddOffrow.toDFперетворюється на DataFrame.

  • 2) Використання createDataFrameконтексту sql

    val df = spark.createDataFrame(rddOfRow, schema)

де схема може бути з деякими з варіантів нижче , як описано хорошим SO пост ..
Час від Scala класу і Reflection API сходи

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

АБО за допомогою Encoders

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

як описано у схемі, також можна створити за допомогою StructTypeі StructField

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

опис зображення

Насправді зараз є 3 API Apache Spark ..

введіть тут опис зображення

  1. RDD API:

RDD(Еластичні Розподілена Dataset) API був в Спарк з моменту випуску 1.0.

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

Приклад RDD:

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

Приклад: Фільтр за атрибутом за допомогою RDD

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

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

DataFrameAPI радикально відрізняється від RDDAPI , тому що це API для побудови реляційної плану запиту , що Catalyst оптимізатор іскри з може потім виконати. API природний для розробників, які знайомі з планами запитів на будівництво

Приклад стилю SQL:

df.filter("age > 21");

Обмеження: Оскільки код посилається на атрибути даних за назвою, компілятор не може зафіксувати помилки. Якщо імена атрибутів невірні, помилка буде виявлена ​​лише під час виконання, коли буде створений план запиту.

Іншим недоліком DataFrameAPI є те, що він дуже орієнтований на масштаби і хоча він підтримує Java, підтримка обмежена.

Наприклад, під час створення DataFrameз існуючих RDDоб’єктів Java оптимізатор каталізатора Spark не може зробити висновок про схему і передбачає, що будь-які об'єкти в DataFrame реалізують scala.Productінтерфейс. Scala case classрозробляє поле, оскільки вони реалізують цей інтерфейс.

  1. Dataset API

DatasetAPI, випущений в якості API попереднього перегляду в Спарк 1.6, прагне забезпечити найкраще з обох світів; знайомий об'єктно-орієнтований стиль програмування та безпека типу RDDAPI для компіляції, але з перевагами продуктивності оптимізатора запитів Catalyst. Набори даних також використовують той же ефективний механізм зберігання поза нагромадженням, що і DataFrameAPI.

Що стосується серіалізації даних, DatasetAPI має концепцію кодерів, які перекладають між представленнями (об'єктами) JVM та внутрішнім бінарним форматом Spark. Spark має вбудовані кодери, які дуже вдосконалені тим, що вони генерують байтовий код для взаємодії з позабірними даними та надання доступу за запитом до окремих атрибутів без необхідності десериалізації цілого об'єкта. Spark ще не надає API для впровадження користувацьких кодерів, але це планується для майбутнього випуску.

Крім того, DatasetAPI призначений для однакової роботи як з Java, так і з Scala. Працюючи з об’єктами Java, важливо, щоб вони повністю відповідали сумісності.

Приклад Datasetстилю API SQL:

dataset.filter(_.age < 21);

Оцінки різні. між DataFrame& DataSet: введіть тут опис зображення

Течія рівня каталістів. . (Демістифікація презентації DataFrame та набору даних із саміту іскри) введіть тут опис зображення

Далі читайте ... статтю зі статтями даних - Казка про три Apache Spark API: RDD vs DataFrames і набори даних


Що таке сильно типізована структура набору даних? Чим він відрізняється від DataFrame?
Арвінд Кумар

Які помилки аналізу охоплені наборами даних?
Neeleshkumar S

5
@ neelesh-srinivasan: взяти приклад у синтаксисі фрейму даних, df.filter("age > 21");це можна оцінити / проаналізувати лише під час виконання. з моменту його рядка. У випадку наборів даних, набори даних відповідають сумісності. тому вік є власністю бобів. якщо властивості віку немає у вашому бобі, ви дізнаєтесь про це рано, тобто за час компіляції (тобто dataset.filter(_.age < 21);). Помилка аналізу може бути перейменована як помилки оцінювання.
Рам Ґадіярам

@NeeleshSrinivasan: для отримання додаткової інформації та деталей див. Apache-
spark

Перша картина вводить в оману. Набори даних недоступні в Python
Yeikel

135

Apache Spark надають три типи API

  1. RDD
  2. DataFrame
  3. Набір даних

Порівнюючи API RDD, Dataframe та Dataset

Ось порівняння API між RDD, Dataframe та набором даних.

RDD

Основна абстракція, яку надає Spark, - це стійкий розподілений набір даних (RDD), який представляє собою сукупність елементів, розподілених по вузлах кластера, якими можна керувати паралельно.

Особливості RDD: -

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

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

  • Толерантність до помилок: Якщо ми втрачаємо деякий розділ RDD, ми можемо відтворити перетворення на цьому розділі в родовому рядку, щоб зробити те саме обчислення, а не робити реплікацію даних у кількох вузлах. Ця характеристика є найбільшою перевагою RDD, оскільки це економить багато зусиль в управлінні та реплікації даних і тим самим досягаються більш швидкі обчислення.

  • Ледачі оцінки: Усі перетворення в Spark ліниві, оскільки вони не підраховують свої результати одразу. Натомість вони просто запам'ятовують перетворення, застосовані до деякого базового набору даних. Перетворення обчислюються лише тоді, коли дія вимагає повернення результату в програму драйверів.

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

  • Формати обробки даних:
    Він може легко та ефективно обробляти структуровані дані, а також неструктуровані дані.

  • Мови програмування підтримуються:
    RDD API доступний на Java, Scala, Python та R.

Обмеження RDD: -

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

  • Обробка структурованих даних: На відміну від Dataframe та наборів даних, RDD не виводить схему введених даних і вимагає від користувача вказати їх.

Кадри даних

Spark представив Dataframes у випуску Spark 1.3. Рамка даних долає ключові проблеми, з якими стикалися RDD.

DataFrame - це розподілений набір даних, організований у названі стовпці. Це концептуально еквівалентно таблиці в реляційній базі даних або R / Python Dataframe. Поряд з Dataframe Spark також представив оптимізатор каталізаторів, який використовує розширені функції програмування для побудови розширюваного оптимізатора запитів.

Особливості фрейму даних: -

  • Розподілена колекція об'єкта рядків: DataFrame - це розподілений набір даних, організований у названі стовпці. Він концептуально еквівалентний таблиці в реляційній базі даних, але з більш багатими оптимізаціями під капотом.

  • Обробка даних: Обробка структурованих та неструктурованих форматів даних (Avro, CSV, еластичний пошук та Кассандра) та систем зберігання даних (HDFS, таблиці HIVE, MySQL тощо). Він може читати і писати з усіх цих різних джерел даних.

  • Оптимізація за допомогою оптимізатора каталізаторів: вона забезпечує як SQL запити, так і API 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. Він повторно використовує Five Frontend та MetaStore і дає вам повну сумісність з існуючими даними Hive та запитами та UDF.

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

  • Мови програмування підтримуються:
    API Dataframe доступний у Java, Scala, Python та R.

Обмеження рамки даних: -

  • Безпека типу компіляції: час, як обговорювалося, API Dataframe не підтримує безпеку часу компіляції, що обмежує маніпулювання даними, коли структура не знає. Наступний приклад працює під час компіляції. Однак ви отримаєте виняток із виконання програми під час виконання цього коду.

Приклад:

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

Це особливо складно, коли ви працюєте з декількома кроками трансформації та агрегації.

  • Неможливо оперувати над об’єктом домену (втрачений об’єкт домену): Після перетворення об’єкта домену в кадр даних, ви не можете відновити його з нього. У наступному прикладі, як тільки ми створимо 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 наборів даних

API набору даних - це розширення до DataFrames, що забезпечує безпечний для об'єктів орієнтований на об'єкт інтерфейс програмування. Це сильно типізована, незмінна колекція об'єктів, які відображені у реляційній схемі.

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

Особливості набору даних: -

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

  • Енкодери: За допомогою Encoders легко перетворити будь-який об’єкт JVM в набір даних, що дозволяє користувачам працювати як зі структурованими, так і з неструктурованими даними на відміну від Dataframe.

  • Мови програмування підтримуються: API наборів даних наразі доступний лише у Scala та Java. Наразі Python та R не підтримуються у версії 1.6. Підтримка Python призначена для версії 2.0.

  • Тип безпеки: API наборів даних забезпечує безпеку часу компіляції, яка не була доступна в Dataframes. У наведеному нижче прикладі ми можемо побачити, як Набір даних може оперувати доменними об’єктами за допомогою компіляції лямбда-функцій.

Приклад:

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 набори даних підтримують лише Scala та Java. Підтримка Python буде представлена ​​в Spark 2.0.

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


2
Від spark.apache.org/docs/latest/… , в API Scala, DataFrame - це просто псевдонім типу набору даних [Рядок].
Дін Чен

так чи добре сказати, що за допомогою набору даних ми отримуємо безпеку типу і втрачаємо оптимізатор?
Хоа

@BlueSky ви отримаєте безпеку типу та все ще маєте оптимізатор
Gabber

@AmitDubey Це просто неправда. Datasetне є LINQ, а лямбда-вираз не може бути інтерпретований як дерева виразів. Тому є чорні скриньки, і ви втрачаєте майже всі переваги (якщо не всі) оптимізатора. Лише невеликий набір можливих недоліків: Spark 2.0 Dataset vs DataFrame . Крім того, лише повторити щось, про що я заявляв кілька разів - в цілому перевірка типу "кінця до кінця" неможлива за допомогою DatasetAPI. Приєднання - лише найвизначніший приклад.
нуль323

52

Усі (RDD, DataFrame та DataSet) в одному малюнку.

RDD vs DataFrame vs DataSet

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

RDD

RDD являє собою збір елементів, що мають стійкість до відмов, якими можна керувати паралельно.

DataFrame

DataFrameце набір даних, організований у названі стовпці. Це концептуально еквівалентно таблиці в реляційній базі даних або кадру даних в R / Python, але з більш багатими оптимізаціями під кришкою .

Dataset

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


Примітка:

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


Nice comparison of all of them with a code snippet.

RDD vs DataFrame vs DataSet з кодом

джерело


Питання: Чи можете ви перетворити один на інший, як 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

27

Оскільки 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].


5
Якщо бути точним, як для Spark 2.0 Dataframe - це лише псевдонім дляDataset[Row]
zero323

1
@ zero323 Так, але це все ще слабо набрано, саме це я намагався передати.
Юваль Ітчаков

Так, але це швидше питання збережених значень, ніж сам контейнер. Навіть у 1.6 ці двоє були технічно кажучи однаковими, і головна причина триматися окремо DataFrame- уникнути порушення API. У всякому разі, просто хотілося це вказати. Дякую за редагування та репутацію.
нуль323

25

Просто RDDє основним компонентом, але DataFrameце API, що вводиться в іскрі 1.30.

RDD

Збір розділів даних називається 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.


12

Більшість відповідей правильні, тут хочеться додати лише один пункт

У Spark 2.0 два API (DataFrame + DataSet) будуть об'єднані разом в єдиний API.

"Об'єднання DataFrame та набір даних: у Scala та Java DataFrame та Dataset є уніфікованими, тобто DataFrame - це лише псевдонім типу для Dataset of Row. У Python та R, зважаючи на відсутність безпеки типу, DataFrame є основним інтерфейсом програмування."

Набори даних схожі на RDD, однак, замість використання серіалізації Java або Kryo, вони використовують спеціалізований Енкодер для серіалізації об'єктів для обробки або передачі по мережі.

Spark SQL підтримує два різні методи перетворення існуючих RDD в набори даних. Перший метод використовує відображення для визначення схеми RDD, що містить конкретні типи об'єктів. Цей підхід, заснований на рефлексії, призводить до більш короткого коду і добре працює, коли ви вже знаєте схему під час написання програми Spark.

Другий метод створення наборів даних - це через програмний інтерфейс, який дозволяє побудувати схему, а потім застосувати її до існуючого RDD. Хоча цей метод є більш багатослівним, він дозволяє будувати набори даних, коли стовпці та їх типи не відомі до часу виконання.

Тут ви можете знайти RDD tof відповідь на розмову кадру даних

Як перетворити RDD-об'єкт в кадр даних в іскрі


8

DataFrame еквівалентний таблиці в RDBMS і може також маніпулювати аналогічно до "рідних" розподілених колекцій в RDD. На відміну від RDD, Dataframes відслідковують схему та підтримують різні реляційні операції, що призводять до більш оптимізованого виконання. Кожен об'єкт DataFrame представляє логічний план, але через їх "ледачий" характер виконання не відбувається, поки користувач не викликає певну "операцію виводу".


2
RDD також ледачі до речі.
kon psych

6

Кілька розумінь з точки зору використання, RDD та DataFrame:

  1. RDD дивовижні! оскільки вони дають нам усю гнучкість працювати з практично будь-якими видами даних; неструктуровані, напівструктуровані та структуровані дані. Оскільки, багато разів дані не готові бути встановленими у DataFrame (навіть JSON), RDD можуть використовуватися для попередньої обробки даних, щоб вони могли вміститися у кадр даних. RDD - це основна абстракція даних у Spark.
  2. Не всі перетворення, можливі в RDD, можливі в DataFrames, наприклад, віднімання () призначене для RDD vs, крім () є для DataFrame.
  3. Оскільки DataFrames - це як реляційна таблиця, вони дотримуються суворих правил при використанні перетворень теорії множин / реляцій, наприклад, якщо ви хочете об'єднати два кадри даних, вимога полягає в тому, що обидва dfs мають однакову кількість стовпців і пов'язані з ними типи даних стовпців. Назви стовпців можуть бути різними. Ці правила не поширюються на RDD. Ось хороший підручник, що пояснює ці факти.
  4. Під час використання DataFrames є підвищення продуктивності, як це вже було детально пояснено.
  5. Використовуючи DataFrames, вам не потрібно передавати довільну функцію, як це робиться при програмуванні з RDD.
  6. Для програмування фреймів даних вам потрібен SQLContext / HiveContext, оскільки вони лежать в області SparkSQL іскрової екосистеми, але для RDD вам потрібні лише SparkContext / JavaSparkContext, які лежать у бібліотеках Spark Core.
  7. Ви можете створити df з RDD, якщо зможете визначити схему для нього.
  8. Ви також можете перетворити df в rdd і rdd в df.

Я сподіваюся, що це допомагає!


5

Кадр даних - це RDD об'єктів рядків, кожен з яких представляє запис. Рамка даних також знає схему (тобто поля даних) своїх рядків. Хоча Dataframes схожі на звичайні RDD, вони внутрішньо зберігають дані більш ефективно, користуючись їх схемою. Крім того, вони надають нові операції, недоступні для RDD, такі як можливість запускати SQL запити. Рамки даних можуть бути створені із зовнішніх джерел даних, з результатів запитів або з звичайних RDD.

Довідка: Zaharia M., et al. Навчальна іскра (O'Reilly, 2015)


1

Spark RDD (resilient distributed dataset) :

RDD - це основний API абстрагування даних і доступний з самого першого випуску Spark (Spark 1.0). Це нижчий рівень API для управління розподіленим збором даних. API API RDD розкриває деякі надзвичайно корисні методи, які можна використовувати для отримання дуже жорсткого контролю над базовою фізичною структурою даних. Це незмінна (лише для читання) збірка розділених даних, що поширюються на різних машинах. 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 -

введіть тут опис зображення


0

DataFrame є РДД , який має схему. Ви можете розглядати це як таблицю реляційних баз даних, оскільки кожен стовпець має ім'я та відомий тип. Потужність DataFrames походить від того, що, коли ви створюєте DataFrame зі структурованого набору даних (Json, Parquet ..), Spark може зробити схему, зробивши перехід на весь набір даних (Json, Parquet ..), що завантажується. Тоді при розрахунку плану виконання Spark може використовувати схему і робити значно кращі оптимізації обчислень. Зауважте, що DataFrame називався SchemaRDD перед Spark v1.3.0


0

Apache Spark - RDD, DataFrame та DataSet

Spark RDD -

RDD означає стійкий розподілений набір даних. Це колекція записів для розділів лише для читання. RDD - це основна структура даних Spark. Це дозволяє програмісту виконувати обчислення в пам'яті на великих кластерах з відмовою. Таким чином, пришвидшити завдання.

Іскровий кадр даних -

На відміну від RDD, дані, організовані в іменовані стовпці. Наприклад таблиця у реляційній базі даних. Це незмінний розподілений збір даних. DataFrame in Spark дозволяє розробникам нав'язувати структуру розподіленому набору даних, що дозволяє абстрагуватися на більш високому рівні.

Іскровий набір даних -

Набори даних у Apache Spark - це розширення API DataFrame, який забезпечує безпечний для об'єктів орієнтований на об'єкти інтерфейс програмування. Набір даних використовує переваги оптимізатора каталізаторів Spark, відкриваючи вирази та поля даних планувальнику запитів.


-1

Ви можете використовувати RDD зі структурованими та неструктурованими там, де Dataframe / Dataset може обробляти лише структуровані та напівструктуровані дані (має належну схему)


-2

Усі чудові відповіді та використання кожного API мають певні вигоди. Набір даних створений як супер API для вирішення багатьох проблем, але багато разів RDD як і раніше працює найкраще, якщо ви розумієте свої дані та якщо алгоритм обробки оптимізований для того, щоб робити багато речей за один пропуск до великих даних, тоді RDD здається найкращим варіантом.

Агрегація за допомогою API набору даних все ще споживає пам'ять і з часом буде покращуватися.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.