Aller au contenu principal

Travailler avec des DataFrames et des tables en R

important

SparkR dans Databricks est déprécié dans Databricks Runtime 16.0 et versions ultérieures. Databricks recommande d'utiliser sparklyr plutôt.

Cet article décrit comment utiliser des packages R tels que SparkR, sparklyr et dplyr pour travailler avec des data.frameR, des DataFrames Spark et des tables en mémoire.

Notez que lorsque vous travaillez avec SparkR, sparklyr et dplyr, vous constaterez peut-être que vous pouvez effectuer une opération particulière avec tous ces packages, et vous pouvez utiliser le package avec lequel vous êtes le plus à l'aise. Par exemple, pour exécuter une requête, vous pouvez appeler des fonctions telles que SparkR::sql, sparklyr::sdf_sql et dplyr::select. À d'autres moments, vous pourriez être en mesure d'effectuer une opération avec seulement un ou deux de ces packages, et l'opération que vous choisissez dépend de votre scénario d'utilisation. Par exemple, la manière dont vous appelez sparklyr::sdf_quantile diffère légèrement de la manière dont vous appelez dplyr::percentile_approx, même si les deux fonctions calculent des quantiles.

Vous pouvez utiliser SQL comme un pont entre SparkR et sparklyr. Par exemple, vous pouvez utiliser SparkR::sql pour interroger les tables que vous créez avec sparklyr. Vous pouvez utiliser sparklyr::sdf_sql pour query les tables que vous créez avec SparkR. Et le code dplyr est toujours traduit en SQL en mémoire avant d'être exécuté. Voir aussi l'interopérabilité des API et la traduction SQL.

Charger SparkR, sparklyr et dplyr

Les packages SparkR, sparklyr et dplyr sont inclus dans Databricks Runtime installé sur les clusters Databricks. Par conséquent, vous n'avez pas besoin d'appeler le install.package habituel avant de pouvoir commencer à appeler ces packages. Cependant, vous devez toujours charger ces packages avec library en premier. Par exemple, depuis un Notebook R dans un Workspace Databricks, exécutez le code suivant dans une cellule de notebook pour charger SparkR, sparklyr et dplyr :

R
library(SparkR)
library(sparklyr)
library(dplyr)

Connecter sparklyr à un cluster

Après avoir chargé sparklyr, vous devez appeler sparklyr::spark_connect pour vous connecter au cluster, en spécifiant la méthode de connexion databricks. Par exemple, exécutez le code suivant dans une cellule de Notebook pour vous connecter au cluster qui héberge le Notebook :

sc <- spark_connect(method = "databricks")

En revanche, un Notebook Databricks établit déjà un SparkSession sur le cluster pour l'utilisation avec SparkR, vous n'avez donc pas besoin d'appeler SparkR::sparkR.session avant de pouvoir commencer à appeler SparkR.

Upload un fichier de données JSON vers votre Workspace

De nombreux exemples de code dans cet article sont basés sur des données situées à un emplacement spécifique dans votre Databricks Workspace, avec des noms de colonne et des types de données spécifiques. Les données de cet exemple de code proviennent d'un fichier JSON nommé book.json à partir de GitHub. Pour obtenir ce fichier et l'upload dans votre Workspace :

  1. Accédez au fichier books.json sur GitHub et utilisez un éditeur de texte pour copier son contenu dans un fichier nommé books.json sur votre machine locale.
  2. Dans la barre latérale de votre workspace Databricks, cliquez sur Catalogue .
  3. Cliquez sur Créer une table .
  4. Dans l'onglet Upload File , déposez le fichier books.json depuis votre machine locale dans la zone Déposez les fichiers à uploader . Ou sélectionnez **cliquer pour parcourir**, et accédez au books.json fichier depuis votre machine locale.

Par défaut, Databricks télécharge votre fichier books.json local vers l'emplacement DBFS dans votre Workspace avec le chemin /FileStore/tables/books.json.

Ne cliquez pas sur Créer une table avec l’interface utilisateur ni sur Créer une table dans le Notebook . Les exemples de code de cet article utilisent les données du fichier books.json importé à cet emplacement DBFS.

Lire les données JSON dans un DataFrame

Utilisez sparklyr::spark_read_json pour lire le fichier JSON upload dans un DataFrame, en spécifiant la connexion, le chemin d’accès au fichier JSON et un nom pour la représentation interne de la table des données. Pour cet exemple, vous devez spécifier que le fichier book.json contient plusieurs lignes. La spécification du schéma des colonnes ici est facultative. Autrement, sparklyr infère le schéma des colonnes par default. Par exemple, exécutez le code suivant dans une cellule de Notebook pour lire les données du fichier JSON upload dans un DataFrame nommé jsonDF:

R
jsonDF <- spark_read_json(
sc = sc,
name = "jsonTable",
path = "/FileStore/tables/books.json",
options = list("multiLine" = TRUE),
columns = c(
author = "character",
country = "character",
imageLink = "character",
language = "character",
link = "character",
pages = "integer",
title = "character",
year = "integer"
)
)

Imprimer les premières lignes d'un DataFrame

Vous pouvez utiliser SparkR::head, SparkR::show ou sparklyr::collect pour afficher les premières lignes d'un DataFrame. Par défaut, head affiche les six premières lignes par default. show et collect affichent les 10 premières lignes. Par exemple, exécutez le code suivant dans une cellule de Notebook pour afficher les premières lignes du DataFrame nommé jsonDF:

R
head(jsonDF)

# Source: spark<?> [?? x 8]
# author country image…¹ langu…² link pages title year
# <chr> <chr> <chr> <chr> <chr> <int> <chr> <int>
# 1 Chinua Achebe Nigeria images… English "htt… 209 Thin… 1958
# 2 Hans Christian Andersen Denmark images… Danish "htt… 784 Fair… 1836
# 3 Dante Alighieri Italy images… Italian "htt… 928 The … 1315
# 4 Unknown Sumer and Akk… images… Akkadi… "htt… 160 The … -1700
# 5 Unknown Achaemenid Em… images… Hebrew "htt… 176 The … -600
# 6 Unknown India/Iran/Ir… images… Arabic "htt… 288 One … 1200
# … with abbreviated variable names ¹​imageLink, ²​language

show(jsonDF)

# Source: spark<jsonTable> [?? x 8]
# author country image…¹ langu…² link pages title year
# <chr> <chr> <chr> <chr> <chr> <int> <chr> <int>
# 1 Chinua Achebe Nigeria images… English "htt… 209 Thin… 1958
# 2 Hans Christian Andersen Denmark images… Danish "htt… 784 Fair… 1836
# 3 Dante Alighieri Italy images… Italian "htt… 928 The … 1315
# 4 Unknown Sumer and Ak… images… Akkadi… "htt… 160 The … -1700
# 5 Unknown Achaemenid E… images… Hebrew "htt… 176 The … -600
# 6 Unknown India/Iran/I… images… Arabic "htt… 288 One … 1200
# 7 Unknown Iceland images… Old No… "htt… 384 Njál… 1350
# 8 Jane Austen United Kingd… images… English "htt… 226 Prid… 1813
# 9 Honoré de Balzac France images… French "htt… 443 Le P… 1835
# 10 Samuel Beckett Republic of … images… French… "htt… 256 Moll… 1952
# … with more rows, and abbreviated variable names ¹​imageLink, ²​language
# ℹ Use `print(n = ...)` to see more rows

collect(jsonDF)

# A tibble: 100 × 8
# author country image…¹ langu…² link pages title year
# <chr> <chr> <chr> <chr> <chr> <int> <chr> <int>
# 1 Chinua Achebe Nigeria images… English "htt… 209 Thin… 1958
# 2 Hans Christian Andersen Denmark images… Danish "htt… 784 Fair… 1836
# 3 Dante Alighieri Italy images… Italian "htt… 928 The … 1315
# 4 Unknown Sumer and Ak… images… Akkadi… "htt… 160 The … -1700
# 5 Unknown Achaemenid E… images… Hebrew "htt… 176 The … -600
# 6 Unknown India/Iran/I… images… Arabic "htt… 288 One … 1200
# 7 Unknown Iceland images… Old No… "htt… 384 Njál… 1350
# 8 Jane Austen United Kingd… images… English "htt… 226 Prid… 1813
# 9 Honoré de Balzac France images… French "htt… 443 Le P… 1835
# 10 Samuel Beckett Republic of … images… French… "htt… 256 Moll… 1952
# … with 90 more rows, and abbreviated variable names ¹​imageLink, ²​language
# ℹ Use `print(n = ...)` to see more rows

Exécuter des queries SQL, et écrire et lire à partir d'une table

Vous pouvez utiliser les fonctions dplyr pour exécuter des query SQL sur un DataFrame. Par exemple, exécutez le code suivant dans une cellule de Notebook pour utiliser dplyr::group_by et dployr::count afin d'obtenir le nombre d'auteurs du DataFrame nommé jsonDF. Utilisez dplyr::arrange et dplyr::desc pour trier le résultat par ordre décroissant en fonction du nombre. Ensuite, imprimez les 10 premières lignes par default.

R
group_by(jsonDF, author) %>%
count() %>%
arrange(desc(n))

# Source: spark<?> [?? x 2]
# Ordered by: desc(n)
# author n
# <chr> <dbl>
# 1 Fyodor Dostoevsky 4
# 2 Unknown 4
# 3 Leo Tolstoy 3
# 4 Franz Kafka 3
# 5 William Shakespeare 3
# 6 William Faulkner 2
# 7 Gustave Flaubert 2
# 8 Homer 2
# 9 Gabriel García Márquez 2
# 10 Thomas Mann 2
# … with more rows
# ℹ Use `print(n = ...)` to see more rows

Vous pourriez alors utiliser sparklyr::spark_write_table pour écrire le résultat dans une table de Databricks. Par exemple, exécutez le code suivant dans une cellule de Notebook pour relancer la query et écrire le résultat dans une table nommée json_books_agg:

R
group_by(jsonDF, author) %>%
count() %>%
arrange(desc(n)) %>%
spark_write_table(
name = "json_books_agg",
mode = "overwrite"
)

Pour vérifier que la table a été créée, vous pouvez ensuite utiliser sparklyr::sdf_sql avec SparkR::showDF pour afficher les données de la table. Par exemple, exécutez le code suivant dans une cellule de notebook pour interroger la table dans un DataFrame, puis utilisez sparklyr::collect pour afficher les 10 premières lignes du DataFrame par default :

R
collect(sdf_sql(sc, "SELECT * FROM json_books_agg"))

# A tibble: 82 × 2
# author n
# <chr> <dbl>
# 1 Fyodor Dostoevsky 4
# 2 Unknown 4
# 3 Leo Tolstoy 3
# 4 Franz Kafka 3
# 5 William Shakespeare 3
# 6 William Faulkner 2
# 7 Homer 2
# 8 Gustave Flaubert 2
# 9 Gabriel García Márquez 2
# 10 Thomas Mann 2
# … with 72 more rows
# ℹ Use `print(n = ...)` to see more rows

Vous pourriez également utiliser sparklyr::spark_read_table pour faire quelque chose de similaire. Par exemple, exécutez le code suivant dans une cellule de Notebook pour query le DataFrame précédent nommé jsonDF dans un DataFrame, puis utilisez sparklyr::collect pour imprimer les 10 premières lignes du DataFrame par default :

R
fromTable <- spark_read_table(
sc = sc,
name = "json_books_agg"
)

collect(fromTable)

# A tibble: 82 × 2
# author n
# <chr> <dbl>
# 1 Fyodor Dostoevsky 4
# 2 Unknown 4
# 3 Leo Tolstoy 3
# 4 Franz Kafka 3
# 5 William Shakespeare 3
# 6 William Faulkner 2
# 7 Homer 2
# 8 Gustave Flaubert 2
# 9 Gabriel García Márquez 2
# 10 Thomas Mann 2
# … with 72 more rows
# ℹ Use `print(n = ...)` to see more rows

Ajoutez des colonnes et calculez les valeurs de colonne dans un DataFrame

Vous pouvez utiliser les fonctions dplyr pour ajouter des colonnes aux DataFrames et pour calculer les valeurs des colonnes.

Par exemple, exécutez le code suivant dans une cellule de Notebook pour obtenir le contenu du DataFrame nommé jsonDF. Utilisez dplyr::mutate pour ajouter une colonne nommée today, et remplissez cette nouvelle colonne avec le timestamp actuel. Ensuite, écrivez ce contenu dans un nouveau DataFrame nommé withDate et utilisez dplyr::collect pour imprimer les 10 premières lignes du nouveau DataFrame par default.

remarque

dplyr::mutate n'accepte que les arguments conformes aux fonctions intégrées de Hive (également appelées UDFs) et aux fonctions d'agrégation intégrées (également appelées UDAFs). Pour des informations générales, consultez Hive Functions. Pour des informations sur les fonctions liées aux dates dans cette section, consultez Fonctions de date.

R
withDate <- jsonDF %>%
mutate(today = current_timestamp())

collect(withDate)

# A tibble: 100 × 9
# author country image…¹ langu…² link pages title year today
# <chr> <chr> <chr> <chr> <chr> <int> <chr> <int> <dttm>
# 1 Chinua A… Nigeria images… English "htt… 209 Thin… 1958 2022-09-27 21:32:59
# 2 Hans Chr… Denmark images… Danish "htt… 784 Fair… 1836 2022-09-27 21:32:59
# 3 Dante Al… Italy images… Italian "htt… 928 The … 1315 2022-09-27 21:32:59
# 4 Unknown Sumer … images… Akkadi… "htt… 160 The … -1700 2022-09-27 21:32:59
# 5 Unknown Achaem… images… Hebrew "htt… 176 The … -600 2022-09-27 21:32:59
# 6 Unknown India/… images… Arabic "htt… 288 One … 1200 2022-09-27 21:32:59
# 7 Unknown Iceland images… Old No… "htt… 384 Njál… 1350 2022-09-27 21:32:59
# 8 Jane Aus… United… images… English "htt… 226 Prid… 1813 2022-09-27 21:32:59
# 9 Honoré d… France images… French "htt… 443 Le P… 1835 2022-09-27 21:32:59
# 10 Samuel B… Republ… images… French… "htt… 256 Moll… 1952 2022-09-27 21:32:59
# … with 90 more rows, and abbreviated variable names ¹​imageLink, ²​language
# ℹ Use `print(n = ...)` to see more rows

Utilisez maintenant dplyr::mutate pour ajouter deux colonnes supplémentaires au contenu du DataFrame withDate. Les nouvelles colonnes month et year contiennent le mois et l'année numériques de la colonne today. Ensuite, écrivez ce contenu dans un nouveau DataFrame nommé withMMyyyy, et utilisez dplyr::select avec dplyr::collect pour imprimer les colonnes author, title, month et year des dix premières lignes du nouveau DataFrame par default :

R
withMMyyyy <- withDate %>%
mutate(month = month(today),
year = year(today))

collect(select(withMMyyyy, c("author", "title", "month", "year")))

# A tibble: 100 × 4
# author title month year
# <chr> <chr> <int> <int>
# 1 Chinua Achebe Things Fall Apart 9 2022
# 2 Hans Christian Andersen Fairy tales 9 2022
# 3 Dante Alighieri The Divine Comedy 9 2022
# 4 Unknown The Epic Of Gilgamesh 9 2022
# 5 Unknown The Book Of Job 9 2022
# 6 Unknown One Thousand and One Nights 9 2022
# 7 Unknown Njál's Saga 9 2022
# 8 Jane Austen Pride and Prejudice 9 2022
# 9 Honoré de Balzac Le Père Goriot 9 2022
# 10 Samuel Beckett Molloy, Malone Dies, The Unnamable, the … 9 2022
# … with 90 more rows
# ℹ Use `print(n = ...)` to see more rows

Utilisez maintenant dplyr::mutate pour ajouter deux colonnes supplémentaires au contenu du DataFrame withMMyyyy. Les nouvelles colonnes formatted_date contiennent la partie yyyy-MM-dd de la colonne today, tandis que la nouvelle colonne day contient le jour numérique de la nouvelle colonne formatted_date. Ensuite, écrivez ce contenu dans un nouveau DataFrame nommé withUnixTimestamp, et utilisez dplyr::select avec dplyr::collect pour imprimer les colonnes title, formatted_date et day des dix premières lignes du nouveau DataFrame par default :

R
withUnixTimestamp <- withMMyyyy %>%
mutate(formatted_date = date_format(today, "yyyy-MM-dd"),
day = dayofmonth(formatted_date))

collect(select(withUnixTimestamp, c("title", "formatted_date", "day")))

# A tibble: 100 × 3
# title formatted_date day
# <chr> <chr> <int>
# 1 Things Fall Apart 2022-09-27 27
# 2 Fairy tales 2022-09-27 27
# 3 The Divine Comedy 2022-09-27 27
# 4 The Epic Of Gilgamesh 2022-09-27 27
# 5 The Book Of Job 2022-09-27 27
# 6 One Thousand and One Nights 2022-09-27 27
# 7 Njál's Saga 2022-09-27 27
# 8 Pride and Prejudice 2022-09-27 27
# 9 Le Père Goriot 2022-09-27 27
# 10 Molloy, Malone Dies, The Unnamable, the trilogy 2022-09-27 27
# … with 90 more rows
# ℹ Use `print(n = ...)` to see more rows

Créer une vue temporaire

Vous pouvez créer des vues temporaires nommées en mémoire qui sont basées sur des DataFrames existants. Par exemple, exécutez le code suivant dans une cellule de Notebook pour utiliser SparkR::createOrReplaceTempView afin d'obtenir le contenu du DataFrame précédent nommé jsonTable et d'en faire une vue temporaire nommée timestampTable. Ensuite, utilisez sparklyr::spark_read_table pour lire le contenu de la vue temporaire. Utilisez sparklyr::collect pour imprimer les 10 lignes de la table temporaire default :

R
createOrReplaceTempView(withTimestampDF, viewName = "timestampTable")

spark_read_table(
sc = sc,
name = "timestampTable"
) %>% collect()

# A tibble: 100 × 10
# author country image…¹ langu…² link pages title year today
# <chr> <chr> <chr> <chr> <chr> <int> <chr> <int> <dttm>
# 1 Chinua A… Nigeria images… English "htt… 209 Thin… 1958 2022-09-27 21:11:56
# 2 Hans Chr… Denmark images… Danish "htt… 784 Fair… 1836 2022-09-27 21:11:56
# 3 Dante Al… Italy images… Italian "htt… 928 The … 1315 2022-09-27 21:11:56
# 4 Unknown Sumer … images… Akkadi… "htt… 160 The … -1700 2022-09-27 21:11:56
# 5 Unknown Achaem… images… Hebrew "htt… 176 The … -600 2022-09-27 21:11:56
# 6 Unknown India/… images… Arabic "htt… 288 One … 1200 2022-09-27 21:11:56
# 7 Unknown Iceland images… Old No… "htt… 384 Njál… 1350 2022-09-27 21:11:56
# 8 Jane Aus… United… images… English "htt… 226 Prid… 1813 2022-09-27 21:11:56
# 9 Honoré d… France images… French "htt… 443 Le P… 1835 2022-09-27 21:11:56
# 10 Samuel B… Republ… images… French… "htt… 256 Moll… 1952 2022-09-27 21:11:56
# … with 90 more rows, 1 more variable: month <chr>, and abbreviated variable
# names ¹​imageLink, ²​language
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

Effectuez une analyse statistique sur un DataFrame

Vous pouvez utiliser sparklyr avec dplyr pour les analyses statistiques.

Par exemple, créez un DataFrame pour effectuer des statistiques. Pour ce faire, exécutez le code suivant dans une cellule de notebook pour utiliser sparklyr::sdf_copy_to afin d’écrire le contenu du dataset iris qui est intégré à R dans un DataFrame nommé iris. Utilisez sparklyr::sdf_collect pour afficher les 10 premières lignes de la table temporaire par default :

R
irisDF <- sdf_copy_to(
sc = sc,
x = iris,
name = "iris",
overwrite = TRUE
)

sdf_collect(irisDF, "row-wise")

# A tibble: 150 × 5
# Sepal_Length Sepal_Width Petal_Length Petal_Width Species
# <dbl> <dbl> <dbl> <dbl> <chr>
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
# 7 4.6 3.4 1.4 0.3 setosa
# 8 5 3.4 1.5 0.2 setosa
# 9 4.4 2.9 1.4 0.2 setosa
# 10 4.9 3.1 1.5 0.1 setosa
# … with 140 more rows
# ℹ Use `print(n = ...)` to see more rows

Utilisez maintenant dplyr::group_by pour regrouper les lignes par la colonne Species. Utilisez dplyr::summarize avec dplyr::percentile_approx pour calculer les statistiques récapitulatives par les 25e, 50e, 75e et 100e quantiles de la colonne Sepal_Length par Species. Utilisez sparklyr::collect pour afficher les résultats :

remarque

dplyr::summarize n'accepte que les arguments conformes aux fonctions intégrées de Hive (également appelées UDFs) et aux fonctions d'agrégation intégrées (également appelées UDAFs). Pour des informations générales, consultez Hive Functions. Pour des informations sur percentile_approx, consultez Fonctions agrégées intégrées(UDAF).

R
quantileDF <- irisDF %>%
group_by(Species) %>%
summarize(
quantile_25th = percentile_approx(
Sepal_Length,
0.25
),
quantile_50th = percentile_approx(
Sepal_Length,
0.50
),
quantile_75th = percentile_approx(
Sepal_Length,
0.75
),
quantile_100th = percentile_approx(
Sepal_Length,
1.0
)
)

collect(quantileDF)

# A tibble: 3 × 5
# Species quantile_25th quantile_50th quantile_75th quantile_100th
# <chr> <dbl> <dbl> <dbl> <dbl>
# 1 virginica 6.2 6.5 6.9 7.9
# 2 versicolor 5.6 5.9 6.3 7
# 3 setosa 4.8 5 5.2 5.8

Des résultats similaires peuvent être calculés, par exemple, en utilisant sparklyr::sdf_quantile:

R
print(sdf_quantile(
x = irisDF %>%
filter(Species == "virginica"),
column = "Sepal_Length",
probabilities = c(0.25, 0.5, 0.75, 1.0)
))

# 25% 50% 75% 100%
# 6.2 6.5 6.9 7.9