sparklyr 1.4 est présentement vide sur CRAN ! À poser sparklyr 1.4 du CRAN, exécutez

Chez cet entrefilet de blog, quelques-uns présenterons les nouvelles fonctionnalités vigoureusement attendues suivantes du sparklyr Mouture 1.4 :

Digitalisation réfléchi parallélisé

Les lecteurs familiers puis dplyr::sample_n() et dplyr::sample_frac() les prescriptions ont éventuellement remarqué que les double prennent en agio les cas d’manipulation d’aperçu réfléchi sur les trames de éventualité R, par exposé,

dplyr::sample_n(mtcars, size = 3, weight = mpg, replace = FALSE)
               mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Fiat 128      32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Merc 280C     17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4

et

dplyr::sample_frac(mtcars, size = 0.1, weight = mpg, replace = FALSE)
             mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Honda Civic 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Merc 450SE  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Fiat X1-9   27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1

sélectionnera un sous-ensemble incertain de mtcars en utilisant le mpg avec force d’aperçu derrière tout carnèle. Si replace = FALSE est amené, après une carnèle est supprimée de la patrie d’aperçu une coup qu’sézig est sélectionnée, lorsque que donc de la décision replace = TRUEtout carnèle restera assidûment là-dedans la patrie d’aperçu et peut entité sélectionnée distinctes coup.

Désormais, les mêmes cas d’manipulation sont reçu en agio derrière les dataframes Spark là-dedans sparklyr 1.4 ! Par exposé:

library(sparklyr)

sc <- spark_connect(master = "régional")
mtcars_sdf <- copy_to(sc, mtcars, repartition = 4L)

dplyr::sample_n(mtcars_sdf, size = 5, weight = mpg, replace = FALSE)

renverra un sous-ensemble incertain de ébarbé 5 à éloigner de la ossature de éventualité Spark mtcars_sdf.

Davantage orgueilleux aussi, l’processus d’aperçu mis en œuvre là-dedans sparklyr 1.4 est comme sujet qui s’incorruptible foncièrement là-dedans le paradigme MapReduce : avec quelques-uns avons loti à nous mtcars éventualité en 4 partitions de mtcars_sdf en précisant repartition = 4Ll’processus traitera d’voisinage tout partage distinctement et en rapprochement, en élitiste un série d’échantillons de ébarbé jusqu’à 5 là-dedans quiconque, après réduira les 4 ensembles d’échantillons en un série d’échantillons extrême de ébarbé 5 en choisissant les enregistrements renfermant les 5 priorités d’aperçu les mieux élevées chez entiers.

Hein une pareille parallélisation est-elle barcasse, en unique derrière le persistance d’aperçu rien sursis, où le terminaison souhaité est amené avec l’issue d’un marche successif ? Une réplique détaillée à cette matière se trouve là-dedans cet entrefilet de blog, qui comprend une décision du aléa (en unique, la représentativité exacte des force d’aperçu en termes de probabilités), une observation de ardu accord de la terminaison régulière et de la intention qui la sous-tend, et également, les gens justificatifs mathématiques entiers cachés là-dedans un fréquentation proximité un casier PDF, comme que les lecteurs non orientés proximité les mathématiques puissent admettre l’organisant de intégral le addenda rien capital effroi, cependant que les lecteurs orientés proximité les mathématiques peuvent bénéficier de considérer ceux-là sur toutes les intégrales endroit jetant un blessure d’œil à la réplique.

Verbes de Tidyr

Les implémentations spécialisées des éléments suivants tidyr les verbes qui fonctionnent profitablement puis les dataframes Spark ont ​​été interprété là-dedans le approprié de sparklyr 1.4 :

Quelques-uns pouvons déceler hein ces verbes sont utiles derrière attribuer les éventualité à défaut nombreux exemples.

Disons qu’on quelques-uns entendu mtcars_sdfun dataframe Spark cassette toutes les paliers de mtcars mieux le nom de tout carnèle :

# Départ: spark<?> (?? x 12)
  model          mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
  <chr>        <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Mazda RX4     21       6   160   110  3.9   2.62  16.5     0     1     4     4
2 Mazda RX4 W…  21       6   160   110  3.9   2.88  17.0     0     1     4     4
3 Datsun 710    22.8     4   108    93  3.85  2.32  18.6     1     1     4     1
4 Hornet 4 Dr…  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1
5 Hornet Spor…  18.7     8   360   175  3.15  3.44  17.0     0     0     3     2
# … with more rows

et quelques-uns aimerions renouveler entiers les attributs digitaux en mtcar_sdf (en d’contraires termes, toutes les colonnes contraires que la contrefort model contrefort) en paires clé-valeur stockées là-dedans 2 colonnes, puis la key contrefort stockant le nom de tout qualité, et la value contrefort stockant la sang-froid cardinal de tout qualité. Une fabriquer d’y débarquer puis tidyr est en utilisant le tidyr::pivot_longer Fonctionnalité:

mtcars_kv_sdf <- mtcars_sdf %>%
  tidyr::pivot_longer(cols = -model, names_to = "key", values_to = "value")
print(mtcars_kv_sdf, n = 5)
# Départ: spark<?> (?? x 3)
  model     key   value
  <chr>     <chr> <dbl>
1 Mazda RX4 am      1
2 Mazda RX4 carb    4
3 Mazda RX4 cyl     6
4 Mazda RX4 disp  160
5 Mazda RX4 drat    3.9
# … with more rows

Revers supprimer l’conclusion de tidyr::pivot_longerquelques-uns pouvons battre tidyr::pivot_wider à à nous mtcars_kv_sdf Spark dataframe et récupérez les éventualité d’entrée qui accomplissaient incarnes là-dedans mtcars_sdf:

tbl <- mtcars_kv_sdf %>%
  tidyr::pivot_wider(names_from = key, values_from = value)
print(tbl, n = 5)
# Départ: spark<?> (?? x 12)
  model         carb   cyl  drat    hp   mpg    vs    wt    am  disp  gear  qsec
  <chr>        <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Mazda RX4        4     6  3.9    110  21       0  2.62     1  160      4  16.5
2 Hornet 4 Dr…     1     6  3.08   110  21.4     1  3.22     0  258      3  19.4
3 Hornet Spor…     2     8  3.15   175  18.7     0  3.44     0  360      3  17.0
4 Merc 280C        4     6  3.92   123  17.8     1  3.44     0  168.     4  18.9
5 Merc 450SLC      3     8  3.07   180  15.2     0  3.78     0  276.     3  18
# … with more rows

Une divergent fabriquer de diminuer de nombreuses colonnes en moins consiste à tendre tidyr::nest derrière ciller certaines colonnes là-dedans des tables imbriquées. Par exposé, quelques-uns pouvons accoucher une tertre imbriquée perf encapsulant entiers les attributs liés aux performances de mtcars (à humanisme, hp, mpg, dispet qsec). Lorsque, inversement aux dataframes R, les dataframes Spark n’ont pas le projet de tables imbriquées, et le mieux avoisinant des tables imbriquées que quelques-uns pouvons enlever est un perf contrefort cassette des structures nommées puis hp, mpg, dispet qsec les attributs:

mtcars_nested_sdf <- mtcars_sdf %>%
  tidyr::nest(perf = c(hp, mpg, disp, qsec))

Quelques-uns pouvons lorsque approfondir le exemple de perf contrefort là-dedans mtcars_nested_sdf:

sdf_schema(mtcars_nested_sdf)$perf$exemple
(1) "ArrayType(StructType(StructField(hp,DoubleType,true), StructField(mpg,DoubleType,true), StructField(disp,DoubleType,true), StructField(qsec,DoubleType,true)),true)"

et approfondir les éléments de ordonné individuels là-dedans perf:

perf <- mtcars_nested_sdf %>% dplyr::paletot(perf)
unlist(perf((1)))
    hp    mpg   disp   qsec
110.00  21.00 160.00  16.46

Bref, on peut également tendre tidyr::unnest derrière supprimer les uniforme de tidyr::nest:

mtcars_unnested_sdf <- mtcars_nested_sdf %>%
  tidyr::unnest(col = perf)
print(mtcars_unnested_sdf, n = 5)
# Départ: spark<?> (?? x 12)
  model          cyl  drat    wt    vs    am  gear  carb    hp   mpg  disp  qsec
  <chr>        <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Mazda RX4        6  3.9   2.62     0     1     4     4   110  21    160   16.5
2 Hornet 4 Dr…     6  3.08  3.22     1     0     3     1   110  21.4  258   19.4
3 Duster 360       8  3.21  3.57     0     0     3     4   245  14.3  360   15.8
4 Merc 280         6  3.92  3.44     1     0     4     4   123  19.2  168.  18.3
5 Lincoln Con…     8  3     5.42     0     0     3     4   215  10.4  460   17.8
# … with more rows

Détartreur fortin

RobustScaler est une journal fonctionnalité introduite là-dedans Spark 3.0 (SPARK-28399). Acquittement à une paletot request de @zero323, une liaison R derrière RobustScalerà humanisme la ft_robust_scaler() ardeur, catastrophe présentement compétition de sparklyr.

On observe journellement que de certains algorithmes d’vérification déductif fonctionnent plus sur des tapas digitaux standardisées. Fabuleusement d’convaincu quelques-uns ont renseigné là-dedans les statistiques 101 que, rencontrant donné une cyclothymique incertain (X)on peut allier sa norme (mu = E(X))écart-type (sigma = sqrt{E(X^2) – (E(X))^2})après enlever un résultat conforme (z = queue de pie{X – mu}{sigma}) qui a une norme de 0 et un oscillation exemple de 1.

Lorsque, remarquez les double (EX)) et (E(X^2)) plus haut sont des quantités qui peuvent entité habituellement faussées par des latitudes aberrantes extrêmes là-dedans (X)ouvert des distorsions là-dedans (z). Un importun cas unique serait si entiers les non-aberrants chez (X) sont vigoureusement proches de (0)interprète aussi (EX)) avoisinant de (0)cependant que les latitudes aberrantes extrêmes sont toutes autre part là-dedans le angle nenni, attrayant aussi proximité le bas (EX)) en préférant (E(X^2)) proximité le ardu.

Une divergent fabriquer de codifier (X) sur la ossature de ses latitudes médianes, du 1er quartile et du 3e quartile, qui sont toutes robustes vers les latitudes aberrantes, serait la suivante :

(displaystyle z = queue de pie{X – text{Médiane}(X)}{text{P75}(X) – text{P25}(X)})

et c’est nettement ce que propose RobustScaler.

Se référer à ft_robust_scaler() en efficacité et déceler son obligation, quelques-uns pouvons monter par un exposé synthétique hybride des étapes suivantes :

  • Déraciner 500 échantillons aléatoires de la distribue rituelle conforme
  (1) -0.626453811  0.183643324 -0.835628612  1.595280802  0.329507772
  (6) -0.820468384  0.487429052  0.738324705  0.575781352 -0.305388387
  ...
  • Inspectez les latitudes minimales et maximales chez les (500) échantillons aléatoires :
  (1) -3.008049
  (1) 3.810277
  • Créez présentement (dix) d’contraires latitudes qui sont des latitudes extrêmes proportionnellement à la (500) échantillons aléatoires plus haut. Incarnant donné que quelques-uns savons intégral (500) les échantillons sont là-dedans la éventail de ((-4, 4))quelques-uns pouvons apprendre (-501, -502, ldots, -509, -510) avec à nous (dix) latitudes aberrantes :
outliers <- -500L - seq(10)
  • Chaque simuler (510) latitudes là-dedans un dataframe Spark homologué sdf
library(sparklyr)

sc <- spark_connect(master = "régional", traduction = "3.0.0")
sdf <- copy_to(sc, data.frame(value = c(sample_values, outliers)))
  • Quelques-uns pouvons lorsque battre ft_robust_scaler() derrière enlever la sang-froid normalisée derrière tout vestibule :
scaled <- sdf %>%
  ft_vector_assembler("value", "input") %>%
  ft_robust_scaler("input", "scaled") %>%
  dplyr::paletot(scaled) %>%
  unlist()
  • Le tracé du terminaison éventaire que les points de éventualité non aberrants sont mis à l’échelette en latitudes qui forment aussi mieux ou moins une distribue en conformation de sonnaille centrée tout autour de (0)avec envisagé, de nature que la gageure à l’échelette est fortin vers l’ascendant des latitudes aberrantes :

  • Bref, quelques-uns pouvons balancer la distribue des latitudes caves à l’échelette plus haut puis la distribue des scores z de toutes les latitudes d’vestibule, et noter hein la gageure à l’échelette de l’vestibule puis mais la norme et l’oscillation exemple aurait déclenché une dissymétrie important – que le scaler fortin a mérité à abstenir :
all_values <- c(sample_values, outliers)
z_scores <- (all_values - mean(all_values)) / sd(all_values)
ggplot(data.frame(scaled = z_scores), aes(x = scaled)) +
  xlim(-0.05, 0.2) +
  geom_histogram(binwidth = 0.005)

  • À éloigner des 2 graphiques plus haut, on peut enregistrer que les double marche de standardisation ont conséquence des distributions aussi en conformation de sonnaille, icelle produite par ft_robust_scaler() est centré tout autour (0)indiquant avoir la norme chez toutes les latitudes non aberrantes, cependant que la distribue des scores z n’est carrément pas centrée tout autour (0) car son attachement a été considérablement bougé par la (dix) latitudes aberrantes.

RAPIDES

Les lecteurs qui suivent intimement les versions d’Indien Spark ont ​​virtuellement remarqué l’affixe jeune de la séduction en agio de l’accroissement GPU RAPIDS là-dedans Spark 3.0. Rattrapant ce exaspération jeune, une élection permettant d’créer RAPIDS là-dedans les connexions Spark a aussi été créée là-dedans sparklyr et expédié en sparklyr 1.4. Sur un maître puis un physiologique associable RAPIDS (par exposé, une pétition Amazon EC2 de exemple ‘p3.2xlarge’), on peut poser sparklyr 1.4 et observez l’accroissement matérielle RAPIDS reflétée là-dedans les échelons de supplique palpable Spark SQL :

library(sparklyr)

sc <- spark_connect(master = "régional", traduction = "3.0.0", packages = "rapids")
dplyr::db_explain(sc, "SELECT 4")
== Physical Gain ==
*(2) GpuColumnarToRow false
+- GpuProject (4 AS 4#45)
   +- GpuRowToColumnar TargetSize(2147483647)
      +- *(1) Scan OneRowRelation()

Toutes les prescriptions d’acte curé dernièrement introduites à éloigner de Spark 3.0, analogues que array_sort() puis comparateur spécifié, transform_keys(), transform_values()et map_zip_with()sont reçu en agio par sparklyr 1.4.

De mieux, toutes les prescriptions d’acte curé sont désormais accessibles partir via dplyr de préférence que à elles hof_* homologues là-dedans sparklyr. Ceci signifie, par exposé, que quelques-uns pouvons terminer ce qui suit dplyr requêtes derrière allier le spontané de entiers les éléments du écriteau là-dedans la contrefort x de sdfaprès triez-les par acte déclinant :

library(sparklyr)

sc <- spark_connect(master = "régional", traduction = "3.0.0")
sdf <- copy_to(sc, tibble::tibble(x = list(c(-3, -2, 1, 5), c(6, -7, 5, 8))))

sq_desc <- sdf %>%
  dplyr::mutate(x = transform(x, ~ .x * .x)) %>%
  dplyr::mutate(x = array_sort(x, ~ as.integer(sign(.y - .x)))) %>%
  dplyr::paletot(x)

print(sq_desc)
((1))
(1) 25  9  4  1

((2))
(1) 64 49 36 25

Guet

Chez l’acte chronologique, quelques-uns tenons à destituer les créatures suivantes derrière à elles impôt à sparklyr 1.4 :

Quelques-uns apprécions aussi les relations de bogues, les demandes de fonctionnalités et d’contraires mémoires torturé sur sparklyr de à nous émoustillant église open avènement (par exposé, la ardeur d’aperçu réfléchi là-dedans sparklyr 1.4 a été en masse justifié par ce aléa Github déposé par @ajing, et les gens dplyr– les corrections de bogues liées à cette traduction ont été lancées là-dedans # 2648 et complétées puis cette prescrit d’énucléation par @wkdavis).

Bref, l’créateur de ce bordereau de blog est naturellement obligé derrière les excellents suggestions éditoriales de @javierluraschi, @batpigandme et @skeydan.

Si toi-même souhaitez en humanisme mieux sur sparklyrquelques-uns toi-même recommandons de enquêter sparklyr.ai, spark.rstudio.com, aussi que certaines des hebdomadaires précédentes analogues que sparklyr 1.3 et sparklyr 1.2.

Miséricorde d’capital lu!

By nsmaat