web-dev-qa-db-fra.com

Écriture de SQL et utilisation des API Dataframe dans Spark SQL

Je suis une nouvelle abeille dans le monde Spark SQL. Je migre actuellement le code Ingestion de mon application qui comprend l'ingestion de données en phase, la couche Raw et Application en HDFS et le CDC (changement de capture de données), ceci est actuellement écrit dans les requêtes Hive et est exécuté via Oozie. Cela doit migrer dans une application Spark (version actuelle 1.6). L'autre section du code migrera plus tard.

Dans spark-SQL, je peux créer des cadres de données directement à partir de tables dans Hive et simplement exécuter des requêtes telles quelles (comme sqlContext.sql("my Hive hql")). L'autre façon serait d'utiliser les API de dataframe et de réécrire le hql de cette façon.

Quelle est la différence entre ces deux approches?

Y a-t-il un gain de performances avec l'utilisation des API Dataframe?

Certaines personnes ont suggéré qu'il existe une couche supplémentaire de SQL que le moteur de base spark doit utiliser lors de l'utilisation directe de requêtes "SQL", ce qui peut avoir une incidence sur les performances dans une certaine mesure, mais je n'ai trouvé aucun élément Je sais que le code serait beaucoup plus compact avec les API Datafrmae mais quand j'ai mes requêtes hql à portée de main, cela vaudrait-il vraiment la peine d'écrire du code complet dans l'API Dataframe?

Merci.

18
PPPP

Question: Quelle est la différence entre ces deux approches? Y a-t-il un gain de performances avec l'utilisation des API Dataframe?


Répondre :

Il y a une étude comparative réalisée par horton works. source ...

L'essentiel est basé sur la situation/le scénario, chacun a raison. il n'y a pas de règle dure et rapide pour en décider. pls passer par ci-dessous ..

RDD, DataFrames et SparkSQL (en fait 3 approches pas seulement 2):

À la base, Spark fonctionne sur le concept de jeux de données distribués résilients, ou RDD:

  • Résilient - si les données en mémoire sont perdues, elles peuvent être recréées
  • Distribué - collection distribuée immuable d'objets en mémoire partitionnée sur plusieurs nœuds de données d'un cluster
  • Jeu de données - les données initiales peuvent provenir de fichiers, être créées par programme, de données en mémoire ou d'un autre RDD

L'API DataFrames est un cadre d'abstraction de données qui organise vos données en colonnes nommées:

  • Créer un schéma pour les données
  • Conceptuellement équivalent à une table dans une base de données relationnelle
  • Peut être construit à partir de nombreuses sources, y compris des fichiers de données structurés, des tables dans Hive, des bases de données externes ou des RDD existants
  • Fournit une vue relationnelle des données pour faciliter SQL comme les manipulations et les agrégations de données
  • Sous le capot, c'est une rangée de RDD

SparkSQL est un module Spark pour le traitement de données structurées. Vous pouvez interagir avec SparkSQL via:

  • SQL
  • API DataFrames
  • API de jeux de données

Résultats de test:

  • RDF DataFrames et SparkSQL surpassés pour certains types de traitement de données
  • Les DataFrames et SparkSQL ont réalisé à peu près la même chose, bien qu'avec l'analyse impliquant l'agrégation et le tri, SparkSQL avait un léger avantage

  • Syntaxiquement parlant, DataFrames et SparkSQL sont beaucoup plus intuitifs que l’utilisation de RDD

  • A pris le meilleur des 3 pour chaque test

  • Les temps étaient cohérents et ne variaient pas beaucoup entre les tests

  • Les travaux ont été exécutés individuellement sans aucun autre travail en cours d'exécution

Recherche aléatoire contre 1 ID de commande parmi 9 millions d'ID de commande unique GROUPE tous les différents produits avec leur nombre total et tri décroissant par nom de produit

enter image description here

12
Ram Ghadiyaram

Dans vos Spark requêtes de chaîne SQL, vous ne connaîtrez pas d'erreur de syntaxe avant l'exécution (ce qui pourrait être coûteux), tandis que dans DataFrames, des erreurs de syntaxe peuvent être détectées au moment de la compilation.

10
Arun Sharma

Si la requête est longue, alors l'écriture efficace de la requête en cours d'exécution ne sera pas possible. D'un autre côté, DataFrame, avec l'API Column, aide le développeur à écrire du code compact, ce qui est idéal pour les applications ETL.

En outre, toutes les opérations (par exemple supérieures à, inférieures à, sélectionnez, où etc.) .... exécutées à l'aide de "DataFrame" construisent un " arbre de syntaxe abstraite (AST) ", qui est ensuite passé à" Catalyst "pour d'autres optimisations. (Source: Spark Livre blanc SQL, Section # 3.)

0
G.S.Tomar