Trouver la médiane et les quantiles dans Apache Spark
Introduction
Lorsque vous traitez de grands ensembles de données, trouver la médiane et les quantiles peut être une tâche coûteuse en termes de calcul. Les capacités informatiques distribuées de Spark le rendent bien adapté à la gestion de tels calculs.
Spark 2.0
approximation avec approxQuantile :
Spark 2.0 et versions ultérieures fournissent la méthode approxQuantile, qui exploite l'algorithme de Greenwald-Khanna pour une estimation quantile efficace. Il renvoie la valeur du quantile pour une probabilité p donnée avec un seuil d'erreur relative facultatif.
Exemple :
<code class="python"># DataFrame: df.approxQuantile("x", [0.5], 0.25) # RDD: rdd.map(lambda x: (x,)).toDF().approxQuantile("x", [0.5], 0.25)</code>
SQL :
Dans l'agrégation SQL, vous pouvez utiliser la fonction approx_percentile pour estimer le quantile :
<code class="sql">SELECT approx_percentile(column, 0.5) FROM table;</code>
Pré-Spark 2.0
Échantillonnage et local Calcul :
Pour des ensembles de données plus petits ou lorsque des quantiles exacts ne sont pas requis, l'échantillonnage des données et le calcul des quantiles localement peuvent être une option viable. Cela évite les frais liés au tri et à la distribution des données.
Exemple :
<code class="python">from numpy import median sampled_rdd = rdd.sample(False, 0.1) # Sample 10% of the data sampled_quantiles = median(sampled_rdd.collect())</code>
Tri et partitionnement :
Si l'échantillonnage n'est pas réalisable, le tri des données et la recherche de la médiane ou d'autres quantiles peuvent être effectués directement sur le RDD. Cependant, cette approche peut être plus lente et moins efficace que l'échantillonnage.
Exemple :
<code class="python">import numpy as np # Sort and compute quantiles sorted_rdd = rdd.sortBy(lambda x: x) partition_index = int(len(rdd.collect()) * p) partition_value = sorted_rdd.collect()[partition_index] # Compute quantiles by splitting the partitions if p == 0.5: median = partition_value else: partition_value_left = sorted_rdd.collect()[partition_index - 1] median = partition_value_left + (p - 0.5) * (partition_value - partition_value_left)</code>
Hive UDAF :
Si vous utilisez HiveContext, vous pouvez exploiter les UDAF Hive pour calculer les quantiles :
<code class="python"># Continuous values: sqlContext.sql("SELECT percentile(x, 0.5) FROM table") # Integral values: sqlContext.sql("SELECT percentile_approx(x, 0.5) FROM table")</code>
Conclusion
Spark propose diverses options pour trouver la médiane et les quantiles. Le choix de la méthode dépend de facteurs tels que la taille des données, les exigences de précision et la disponibilité de HiveContext.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!