在Apache Spark 中找出中位數和分位數
簡介
簡介處理大型資料集時,查找中位數和分位數可能是一項計算成本高昂的任務。 Spark 的分散式運算能力使其非常適合處理此類運算。
Spark 2.0
使用approxQuantile 進行近似:
Spark 2.0及以上版本Greenwald-Khanna演算法進行高效率的分位數估計。它會傳回給定機率 p 的分位數值以及可選的相對誤差閾值。<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>
範例:
<code class="sql">SELECT approx_percentile(column, 0.5) FROM table;</code>
在SQL 聚合中,可以使用approx_percentile 函數來估計分位數:
Pre-Spark 2.0
取樣與局部計算:
對於較小的資料集或不需要精確的分位數時,對資料進行取樣並在本地計算分位數可能是可行的選擇。這避免了排序和分發資料的開銷。<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>
範例:
排序與分區:
如果取樣不可行,可以直接在RDD 上對資料進行排序並尋找中位數或其他分位數。但是,與採樣相比,這種方法可能速度較慢且效率較低。<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>
範例:
<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>
如果使用HiveContext,您可以利用HiveContext,您可以利用HiveUD 來計算位數:
結論Spark 提供了多種用於尋找中位數和分位數的選項。方法的選擇取決於資料大小、準確性要求以及 HiveContext 的可用性等因素。以上是如何在 Apache Spark 中高效計算中位數和分位數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!