Vous êtes sur la page 1sur 19

Spark RDD, DataFrame et Dataset

- Draft -

Khaled Jouini
j.khaled@gmail.com

Institut Supérieur d’Informatique et des Technologies de Communication

2020-2021

1 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 1 / 17


1 1. Spark, quésaco?
Data Science Life Cycle

2 2. Saprk SQL : présentation et prise en main


1. Points saillants
2.2. API Dataframe

2 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 2 / 17


1. Spark, quésaco?

Section 1 - 1. Spark, quésaco?

1 1. Spark, quésaco?
Data Science Life Cycle

3 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 3 / 17


1. Spark, quésaco?

1. Spark, quésaco?

Spark : idée essentielle, on compose des chaı̂nes de traitement avec des opérateurs de
haut niveau et les données sont constamment gardés en mémoire vive. Jusqu’à 1000 fois
plus rapide que Hadoop.
Unified Analytics Engine for Big Data : opérateurs de haut niveau pour réaliser différents type
de traitements
SparkSQL : données structurées et semi-structurées. Permet entre autres d’utiliser SQL sur les
collections de données.
Spark Streaming : traitement de flux de données en temps réel
Spark MlLib : algorithme de machine learning
Spark Graphx : sharding et interrogation de données en graphe.

3 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 3 / 17


1. Spark, quésaco? Data Science Life Cycle

1. Spark, quésaco?

4 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 4 / 17


1. Spark, quésaco? Data Science Life Cycle

1. Spark, quésaco?

Un moteur d’exécution distribué basé sur des opérateurs de haut niveau


Application = driver + exécuteurs
Driver = programme qui lance et coordonne plusieurs tâches sur le cluster
Exécuteurs = processus indépendants qui réalisent les tâches de calcul
Dans la suite : version Cloud de Spark (Databricks community Edition)

5 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 5 / 17


2. Saprk SQL : présentation et prise en main

Section 2 - 2. Saprk SQL : présentation et prise en main

2 2. Saprk SQL : présentation et prise en main


1. Points saillants
2.2. API Dataframe

6 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 6 / 17


2. Saprk SQL : présentation et prise en main 1. Points saillants

2.1. Spark SQL

Spark SQL est le module Spark permettant de traiter les données structurées et
semi-structurées avec SQL et la programmation fonctionnelle

Utilité, essentiellement :

Transformation des données (Extract-Load-Transform et non ETL) : Standardisation (renommage


d’attributs, etc.), Déduplication, Vérification, Tri, Jointure, Valeurs manquantes, Suppression de
lignes et de colonnes, etc.

Exploration des données

6 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 6 / 17


2. Saprk SQL : présentation et prise en main 1. Points saillants

2.1. Spark SQL

Spark SQL est le module Spark permettant de traiter les données structurées et
semi-structurées avec SQL et la programmation fonctionnelle

Il est possible d’interagir avec SparkSQL avec les API Dataframe et Dataset. Quelque soit la
manière d’exprimer les traitements, ceux-ci vont être optimisés et exécutés avec le moteur
d’exécution;

Les données structurées et semi-structurées fournissent à Spark des information


supplémentaires lui permettant maintes optimisations.

Spark SQL, fournit plusieurs manières d’exprimer les traitements sur les données structurées et
semi-structurées incluant les requêtes SQL et les expressions lambda de l’API Dataset.

Spark SQL permet également de lire/écrire les données à partir d’une source csv, JSON,
texte, input hadoop, Hive ou JDBC/ODBC. Les données lues à partir d’une source SQL sont
mises dans des dataframes/datasets.

7 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 7 / 17


2. Saprk SQL : présentation et prise en main 2.2. API Dataframe

2.2. API DataFrame

DataFrame API (introduit dans Spark 1.3), renommé en DataSet[Row] depuis la version 2.2

Possibilité d’interroger les données avec des opérateurs SQL ou bien avec une chaı̂ne de
caractère SQL

Introduction de la notion de schéma pour améliorer les performances de la


distribution/sérialisation/désérialisation et en évitant l’envoi/stockage de la structure des classes
(gain de performances par rapport à la sérialisation/désérialisation native de Java).

Spark essaye d’inférer le schéma s’il n’est pas fourni

L’API DataFrame utilise également la sérialisation off-heap (gains par rapport au GC Java) et
effectue certaines transformations directement sur le format binaire.

Conceptuellement un Dataframe se présente sous une forme tabulaire similaire à une table
relationnelle

8 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 8 / 17


2. Saprk SQL : présentation et prise en main 2.2. API Dataframe

2.2. API DataFrame

Data Drame : Abstractionde haut niveau d’un RDD. Représente un tableau de données
avec des lignes et des colonnes (spreadsheet).
Techniquement : collection distribuée d’objets typés. Distribution sur un cluster de machines
(Big Data).
Le concept de Data Frame, n’est pas propre à SparK. On retrouve le même concept dans
Python (pandas) et R. Il est facile de convertir un Data Frame Spark en un Data frame
Python ou R et inversement.

9 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 9 / 17


2. Saprk SQL : présentation et prise en main 2.2. API Dataframe

2.2. Untyped API (a.k.a. DataFrame) - Création d’un DataFrame

Création d’un DataFrame à partir d’un RDD


createDataFrame(data, schema, samplingRatio, verifySchema)

data : RDD, liste de Rows, des NamedTuples ou pandas.DataFrame.

schema : une liste de noms de colonnes. Les types des colonnes peuvent être inférés.

Exemple 1 (avec spécification du schéma) :

sentenceData = spark.createDataFrame([
(1, "ISITCom Spark SQL"),
(1, "ISITCom Spark Spark ML"),
(0, "ISITCom MapReduce"),
(0, "ISITCom Hadoop")],
["label", "sentence"])

10 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 10 / 17


2. Saprk SQL : présentation et prise en main 2.2. API Dataframe

2.2. Création d’un dataframe à partir d’une source de données

11 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 11 / 17


2. Saprk SQL : présentation et prise en main 2.2. API Dataframe

2.2. Création d’un dataframe à partir d’une source de données

Les opérateurs spark.read et spark.write permettent de lire et d’écrire depuis et


vers différentes sources de données.

spark.read.format("format ") / spark.write.format("format ") :


format : json, orc, csv, parquet, avro, jdbc , etc.

Autres formes : spark.read.json(".."), spark.write.json("..")


spark.read.load("..,format="json"),
spark.write.save("..,format="json")

Le format de lecture écriture par défaut utilisé par l’API Dataframe est parquet

df = spark.read.load("...users.parquet")
df.select("_id", "name").write.save("idsNames.parquet")

12 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 12 / 17


2. Saprk SQL : présentation et prise en main 2.2. API Dataframe

2.2. Untyped API (a.k.a. DataFrame) - Opérateurs SQL

Exemple (https://databricks- prod- cloudfront.cloud.databricks.com/public/4027ec902e239c93eaaa8714f173bcfc/


5374664368047379/2828360932413147/1220604254746701/latest.html)

//Pour l’inference du schema s’il n’est pas fourni

import spark.implicits._

val dfA = spark.read.json("artistsSpark.json")

dfA.select("_id", "first_name").show()

dfA.where("birth_date < 1970").show()

//ou avec filter

dfA.filter($"birth_date" < 1970).show()

dfA.select("_id", "first_name").where("birth_date > 1940").where("birth_date <


1970").show()

1
dfA.groupBy("birth_date").count().orderBy("count").show()

1
$ sign is used as a short cut for selecting a column and applying functions on top of it.For ex df.select($"id".isNull).show
which can be other wise written asdf.select(col("id").isNull)
13 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 13 / 17
2. Saprk SQL : présentation et prise en main 2.2. API Dataframe

2.2. Untyped API (a.k.a. DataFrame)

Exemple

import spark.implicits._

val dfM = spark.read.json("moviesSpark.json")

dfM.printSchema()

dfM.groupBy("year").count().show()
dfM.select($"year",$"title").orderBy($"year").show()

val dfA = spark.read.json("artistsSpark.json")

dfA.select("_id", "first_name").where("birth_date > 1940").where("birth_date <


1970").show()
dfA.groupBy($"birth_date").count().orderBy($"count").show()

val jointure = dfM.join(dfA, dfM.col("director._id")===dfA.col("_id")).select($"title",


2
$"first_name").where("genre=’drama’").show()

2
$ sign is used as a short cut for selecting a column and applying functions on top of it.For ex df.select($"id".isNull).show
which can be other wise written asdf.select(col("id").isNull)
14 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 14 / 17
2. Saprk SQL : présentation et prise en main 2.2. API Dataframe

2.2. Untyped API (a.k.a. DataFrame) - Chaı̂ne de caractères SQL

SQL sous forme de chaı̂ne de caractères. La fonction sql de sparkSession permet la


spécification d’un traitement sous la forme d’une requête SQL. Le résultat est un DataFrame

Exemple

// Enregistrement du DataFrame comme vue SQL temporaire

dfM.createOrReplaceTempView("movies")

val sqlDF = spark.sql("select year, count(_id) from movies where


year > 2000 group by year")

sqlDF.show()

dfA.createOrReplaceTempView("artists")

spark.sql("select title, l_name from movies, artists where


movies.director._id=artists._id").show()

15 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 15 / 17


2. Saprk SQL : présentation et prise en main 2.2. API Dataframe

2.2. Untyped API (a.k.a. DataFrame) - Chaı̂ne de caractères SQL

Les vues temporaires sont session-scoped ce qui signifie qu’elles disparaissent un fois la
session qui les as créés se termine.

Il est possible de créer des vues temporaires globales interrogeables à partir des différentes
sessions et qui ne disparaissent qu’à la fermeture de Spark.

// Enregistrement du DataFrame comme vue SQL temporaire globale

df.createGlobalTempView("movies")

// Les vues temporaires globales sont rattachees Œ


a une BD du systŒ
eme
appelee "global_temp"

spark.sql("SELECT * FROM global_temp.movies").show()

16 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 16 / 17


2. Saprk SQL : présentation et prise en main 2.2. API Dataframe

2.2. Untyped API (a.k.a. DataFrame)

Les opérations appliquées à un DataFrame sont soit des transformations soit des actions

Transformation : ne modifie pas un DataFrame, mais dérive un nouveau Dataframe enrichi


de nouvelles informations correspondant à cette transformation.

Action : retourne une valeur après avoir effectué un certain calcul

Transformations : opérations lazy ou à évaluation paresseuse, elles ne vont lancer aucun


calcul sur un Cluster. Les transformations ne sont exécutées que lors du lancement d’une
action.

Ceci permet à spark de libérer la mémoire vive et de ne pas avoir à retourner au driver les
résultats intermédiaires d’une chaı̂ne d’opérations d’être donc plus performant

17 / 17 Khaled Jouini (IsitCom) Spark RDD, DataFrame et Dataset- Draft - 2020-2021 17 / 17

Vous aimerez peut-être aussi