Написание SQL vs с использованием API-интерфейсов Dataframe в Spark SQL

Я новая пчела в мире Spark SQL. В настоящее время я выполняю миграцию кода Ingestion своего приложения, который включает в себя прием данных на стадии, уровень Raw и уровень приложения в HDFS и выполнение CDC (сбор данных изменений), в настоящее время он записан в запросах Hive и выполняется через Oozie. Это необходимо перенести в приложение Spark (текущая версия 1.6). Другой раздел кода будет перенесен позже.

В spark-SQL я могу создавать кадры данных непосредственно из таблиц в Hive и просто выполнять запросы как есть (например, sqlContext.sql("my hive hql")). Другим способом было бы использовать API-интерфейсы dataframe и переписать hql таким образом.

В чем разница в этих двух подходах?

Есть ли какой-либо выигрыш в производительности при использовании API Dataframe?

Некоторые люди предположили, что существует дополнительный уровень SQL, через который должен работать ядро Spark при непосредственном использовании запросов "SQL", что может в некоторой степени повлиять на производительность, но я не нашел никакого материала, подтверждающего это утверждение. Я знаю, что код был бы намного более компактным с API Datafrmae, но когда у меня есть все удобные hql-запросы, действительно ли стоило бы написать полный код в Dataframe API?

Благодарю вас.

Ответ 1

  Вопрос: В чем разница в этих двух подходах? Есть ли какой-либо выигрыш в производительности при использовании API Dataframe?


Ответ:

Существует сравнительное исследование, выполненное Хортоном. источник...

Суть основана на ситуации/сценарии, каждый из которых прав. здесь нет твердое и быстрое правило, чтобы решить это. Просьба пройти ниже.

RDD, DataFrames и SparkSQL (Infact 3 подходит не только 2):

В своей основе Spark использует концепцию отказоустойчивых распределенных наборов данных, или RDD:

  • Эластичный - в случае потери данных в памяти их можно восстановить
  • Распределенный - неизменяемый распределенный набор объектов в памяти, разделенный на множество узлов данных в кластере
  • Набор данных - исходные данные можно получить из файлов, создать программным способом, из данных в памяти или из другого СДР

DataFrames API - это структура абстракции данных, которая организует ваши данные в именованные столбцы:

  • Создать схему для данных
  • Концептуально эквивалентно таблице в реляционной базе данных
  • Может быть создан из многих источников, включая файлы структурированных данных, таблицы в Hive, внешние базы данных или существующие RDD
  • Предоставляет реляционное представление данных для простых SQL-операций, таких как манипулирование данными и агрегирование
  • Под капотом находится ряд СДР

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

  • SQL
  • API DataFrames
  • API наборов данных

Результаты теста:

  • RDD превзошли DataFrames и SparkSQL для некоторых типов обработки данных
  • DataFrames и SparkSQL работали почти одинаково, хотя с анализом, включающим агрегацию и сортировку, SparkSQL имел небольшое преимущество

  • С точки зрения синтаксиса, DataFrames и SparkSQL гораздо более интуитивно понятны, чем использование RDD

  • Взял лучшее из 3 для каждого теста

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

  • Задания выполнялись индивидуально, остальные задания не выполнялись

Случайный поиск по 1 идентификатору заказа из 9 миллионов уникальных идентификаторов заказа Сгруппируйте все различные продукты с их общими счетчиками и сортировкой по убыванию по названию продукта

enter image description here

Ответ 2

В ваших строковых запросах Spark SQL вы не узнаете синтаксическую ошибку до времени выполнения (что может быть дорогостоящим), тогда как в DataFrames синтаксические ошибки могут быть обнаружены во время компиляции.

Ответ 3

Если запрос длинный, то эффективная запись & Выполнение запроса не должно быть возможным. С другой стороны, DataFrame вместе с Column API помогает разработчику писать компактный код, который идеально подходит для приложений ETL.

Кроме того, все операции (например, больше, меньше, чем select, где и т.д.).... выполняемые с использованием DataFrame, создают "Абстрактное синтаксическое дерево (AST)", которое затем передается в "Catalyst" для дальнейшей оптимизации. (Источник: документация Spark SQL, раздел № 3.3)