Датафреймы и наборы данных в Spark - PullRequest
0 голосов
/ 15 февраля 2019

Я новичок в Spark и проходил через Dataframes и Dataset.Я пытался понять разницу между ними, но я запутался.
Я начал здесь и обнаружил, что абстракция RDD произошла в следующем порядке.

СДР (Spark1.0) -> Кадр данных (Spark1.3) -> Набор данных (Spark1.6)

Q.1 По ссылке здесь , здесь написано Фрейм данных является псевдонимом для Набор данных [ Строка ], т.е. Набор данных типа Строка ,Если Dataframe был абстракцией RDD , которая была сделана первой, значит ли это, что Dataset уже существовал из Spark1.3 или когда Spark1.6 был разработан Датафрейм был переопределен как Набор данных [Строка] ?

Q.2 По ссылке здесь говорится:

"Набор данных - это строго типизированная коллекция доменных именобъекты, которые могут быть преобразованы параллельно с использованием функциональных или реляционных операций. Каждый набор данных также имеет нетипизированное представление, называемое DataFrame, который является набором данных Row. "

If, Dataframe на самом деле набор данных [Row] почему Dataframe называется нетипизированным?Разве тип здесь не должен быть Строка [определено здесь ]?

Q.3 Также, если Dataframe является Набор данных [Row] , тогда зачем определять Dataframe отдельно?Кроме того, каждая операция Dataset также должна вызываться в Dataframe.Если приведенное выше утверждение не соответствует действительности или является чем-то верным, пожалуйста, не стесняйтесь отвечать.

Если эти вопросы кажутся общими, пожалуйста, дайте мне знать.Я буду редактировать их по мере необходимости.

1 Ответ

0 голосов
/ 15 февраля 2019
  1. Короткая непрерывность внешнего API (от Shark, теперь удаленного, через SchemaRDD и DataFrame до Dataset[Row]) не означает внутреннюю непрерывность.Внутренний API претерпел значительные изменения, и текущая реализация даже не похожа на первоначальные попытки Spark SQL.

    Не было такого понятия, как Dataset в 1.3, и DataFrame не было объединено с Dataset до 2.0.

  2. Это вряд ли точное описание (то же самоекак весьма неформальное использование «строгой типизации»).Это относится к двум фактам:

    • Row является контейнером (collection-ish) Any, следовательно, значимая static типизация невозможна.Это не означает, что он «нетипизирован» (Any является допустимым элементом иерархии типов), но он просто не предоставляет полезной информации компилятору.

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

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

  3. Кроме того, если Dataframe - это набор данных [Row], то зачем определять Dataframe отдельно?Кроме того, каждая операция набора данных также должна вызываться в Dataframe.

    Это верно, но это не означает обратное.Dataset[Row] - это особый случай из Dataset - в целом он должен обеспечивать не менее Dataset[_], но может предоставить больше.И это именно тот случай.

    Кроме того, это «особый случай» для сохранения обратной совместимости, особенно когда вариант со строгой типизацией гораздо менее популярен и в целом менее эффективен, чем специализированный DataFrameоперации.

...