Condividi tramite


Usare dataframe e tabelle in R

Questo articolo descrive come usare pacchetti R, ad esempio SparkR, sparklyr e dplyr per usare R data.frames, i dataframe Spark e le tabelle in memoria.

Si noti che quando si lavora con SparkR, sparklyr e dplyr, è possibile completare un'operazione specifica con tutti questi pacchetti ed è possibile usare il pacchetto più comodo. Ad esempio, per eseguire una query, è possibile chiamare funzioni come SparkR::sql, sparklyr::sdf_sqle dplyr::select. In altri casi, potrebbe essere possibile completare un'operazione con solo uno o due di questi pacchetti e l'operazione scelta dipende dallo scenario di utilizzo. Ad esempio, il modo in cui si chiama sparklyr::sdf_quantile differisce leggermente dal modo in cui si chiama dplyr::percentile_approx, anche se entrambe le funzioni calcolano quantili.

È possibile usare SQL come bridge tra SparkR e sparklyr. Ad esempio, è possibile usare SparkR::sql per eseguire query sulle tabelle create con sparklyr. È possibile usare sparklyr::sdf_sql per eseguire query sulle tabelle create con SparkR. E dplyr il codice viene sempre convertito in SQL in memoria prima dell'esecuzione. Vedere anche Interoperabilità api e Traduzione SQL.

Caricare SparkR, sparklyr e dplyr

I pacchetti SparkR, sparklyr e dplyr sono inclusi nel runtime di Databricks installato nei cluster Azure Databricks. Pertanto, non è necessario chiamare il solito install.package prima di poter iniziare a chiamare questi pacchetti. Tuttavia, è necessario caricare prima questi pacchetti library . Ad esempio, dall'interno di un notebook R in un'area di lavoro di Azure Databricks, eseguire il codice seguente in una cella del notebook per caricare SparkR, sparklyr e dplyr:

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

Connessione sparklyr a un cluster

Dopo aver caricato sparklyr, è necessario chiamare sparklyr::spark_connect per connettersi al cluster, specificando il databricks metodo di connessione. Ad esempio, eseguire il codice seguente in una cella del notebook per connettersi al cluster che ospita il notebook:

sc <- spark_connect(method = "databricks")

Al contrario, un notebook di Azure Databricks stabilisce già un SparkSession oggetto nel cluster da usare con SparkR, quindi non è necessario chiamare prima di poter iniziare a chiamare SparkR::sparkR.session SparkR.

Caricare un file di dati JSON nell'area di lavoro

Molti degli esempi di codice in questo articolo si basano sui dati in una posizione specifica nell'area di lavoro di Azure Databricks, con nomi di colonna e tipi di dati specifici. I dati per questo esempio di codice hanno origine in un file JSON denominato book.json da GitHub. Per ottenere questo file e caricarlo nell'area di lavoro:

  1. Passare al file books.json in GitHub e usare un editor di testo per copiarne il contenuto in un file denominato books.json in un punto qualsiasi del computer locale.
  2. Nella barra laterale dell'area di lavoro di Azure Databricks fare clic su Catalogo.
  3. Fare clic su Crea tabella.
  4. Nella scheda Carica file rilasciare il books.json file dal computer locale alla casella Rilascia file da caricare . In alternativa, selezionare fare clic per esplorare e passare al books.json file dal computer locale.

Per impostazione predefinita, Azure Databricks carica il file locale books.json nel percorso DBFS nell'area di lavoro con il percorso /FileStore/tables/books.json.

Non fare clic su Crea tabella con l'interfaccia utente o Su crea tabella nel notebook. Gli esempi di codice in questo articolo usano i dati nel file caricato books.json in questo percorso DBFS.

Leggere i dati JSON in un dataframe

Usare sparklyr::spark_read_json per leggere il file JSON caricato in un dataframe, specificando la connessione, il percorso del file JSON e un nome per la rappresentazione interna della tabella dei dati. Per questo esempio, è necessario specificare che il book.json file contiene più righe. La specifica dello schema delle colonne è facoltativa. In caso contrario, sparklyr deduce lo schema delle colonne per impostazione predefinita. Ad esempio, eseguire il codice seguente in una cella del notebook per leggere i dati del file JSON caricato in un dataframe denominato jsonDF:

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"
  )
)

È possibile usare SparkR::head, SparkR::showo sparklyr::collect per stampare le prime righe di un dataframe. Per impostazione predefinita, head stampa le prime sei righe per impostazione predefinita. show e collect stampare le prime 10 righe. Ad esempio, eseguire il codice seguente in una cella del notebook per stampare le prime righe del dataframe denominato jsonDF:

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

Eseguire query SQL e scrivere in e leggere da una tabella

È possibile usare le funzioni dplyr per eseguire query SQL in un dataframe. Ad esempio, eseguire il codice seguente in una cella del notebook da usare dplyr::group_by e dployr::count per ottenere i conteggi dall'autore dal dataframe denominato jsonDF. Usare dplyr::arrange e dplyr::desc per ordinare il risultato in ordine decrescente in base ai conteggi. Stampare quindi le prime 10 righe per impostazione predefinita.

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

È quindi possibile usare sparklyr::spark_write_table per scrivere il risultato in una tabella in Azure Databricks. Ad esempio, eseguire il codice seguente in una cella del notebook per rieseguire la query e quindi scrivere il risultato in una tabella denominata json_books_agg:

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

Per verificare che la tabella sia stata creata, è quindi possibile usare sparklyr::sdf_sql insieme SparkR::showDF a per visualizzare i dati della tabella. Ad esempio, eseguire il codice seguente in una cella del notebook per eseguire una query sulla tabella in un dataframe e quindi usare sparklyr::collect per stampare le prime 10 righe del dataframe per impostazione predefinita:

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

È anche possibile usare sparklyr::spark_read_table per eseguire operazioni simili. Ad esempio, eseguire il codice seguente in una cella del notebook per eseguire una query sul dataframe precedente denominato jsonDF in un dataframe e quindi usare sparklyr::collect per stampare le prime 10 righe del dataframe per impostazione predefinita:

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

Aggiungere colonne e valori di colonna di calcolo in un dataframe

È possibile usare le funzioni dplyr per aggiungere colonne ai dataframe e per calcolare i valori delle colonne.

Ad esempio, eseguire il codice seguente in una cella del notebook per ottenere il contenuto del dataframe denominato jsonDF. Usare dplyr::mutate per aggiungere una colonna denominata todaye riempire questa nuova colonna con il timestamp corrente. Scrivere quindi questi contenuti in un nuovo dataframe denominato withDate e usare dplyr::collect per stampare per impostazione predefinita le prime 10 righe del nuovo dataframe.

Nota

dplyr::mutate accetta solo argomenti conformi alle funzioni predefinite di Hive (note anche come funzioni definite dall'utente) e funzioni di aggregazione predefinite (note anche come funzioni di aggregazione definite dall'utente). Per informazioni generali, vedere Funzioni Hive. Per informazioni sulle funzioni correlate alla data in questa sezione, vedere Funzioni di data.

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

dplyr::mutate Usare ora per aggiungere altre due colonne al contenuto del withDate dataframe. Le nuove month colonne e year contengono il mese numerico e l'anno dalla today colonna . Scrivere quindi questi contenuti in un nuovo dataframe denominato withMMyyyye usare dplyr::select insieme dplyr::collect a per stampare le authorcolonne , monthtitlee year delle prime dieci righe del nuovo dataframe per impostazione predefinita:

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

dplyr::mutate Usare ora per aggiungere altre due colonne al contenuto del withMMyyyy dataframe. Le nuove formatted_date colonne contengono la yyyy-MM-dd parte della today colonna, mentre la nuova day colonna contiene il giorno numerico della nuova formatted_date colonna. Scrivere quindi questi contenuti in un nuovo dataframe denominato withUnixTimestampe usare dplyr::select insieme dplyr::collect a per stampare le titlecolonne , formatted_datee day delle prime dieci righe del nuovo dataframe per impostazione predefinita:

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

Creare una visualizzazione temporanea

È possibile creare viste temporanee denominate in memoria basate su dataframe esistenti. Ad esempio, eseguire il codice seguente in una cella del notebook da usare SparkR::createOrReplaceTempView per ottenere il contenuto del dataframe precedente denominato jsonTable e impostarne una visualizzazione temporanea denominata timestampTable. Usare sparklyr::spark_read_table quindi per leggere il contenuto della visualizzazione temporanea. Utilizzare sparklyr::collect per stampare le prime 10 righe della tabella temporanea per impostazione predefinita:

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

Eseguire un'analisi statistica su un dataframe

È possibile usare sparklyr insieme a dplyr per le analisi statistiche.

Ad esempio, creare un dataframe in cui eseguire le statistiche. A tale scopo, eseguire il codice seguente in una cella del notebook da usare sparklyr::sdf_copy_to per scrivere il contenuto del iris set di dati integrato in R in un dataframe denominato iris. Utilizzare sparklyr::sdf_collect per stampare le prime 10 righe della tabella temporanea per impostazione predefinita:

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

dplyr::group_by Usare ora per raggruppare le righe in base alla Species colonna. Usare dplyr::summarize insieme dplyr::percentile_approx a per calcolare le statistiche di riepilogo in base al 25, al 50, al 75 e al 100° quantile della Sepal_Length colonna in Speciesbase a . Usare sparklyr::collect una stampa dei risultati:

Nota

dplyr::summarize accetta solo argomenti conformi alle funzioni predefinite di Hive (note anche come funzioni definite dall'utente) e funzioni di aggregazione predefinite (note anche come funzioni di aggregazione definite dall'utente). Per informazioni generali, vedere Funzioni Hive. Per informazioni su , vedere Funzioni di aggregazione predefinite (UDAF).For information about percentile_approx, see Built-in Aggregate Functions(UDAF).

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

È possibile calcolare risultati simili, ad esempio usando sparklyr::sdf_quantile:

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