首頁  >  文章  >  後端開發  >  如何在 Apache Spark 中高效計算中位數和分位數?

如何在 Apache Spark 中高效計算中位數和分位數?

DDD
DDD原創
2024-11-02 09:44:02141瀏覽

How to Efficiently Calculate Median and Quantiles in Apache Spark?

在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:

在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>
Hive UDAF:

如果使用HiveContext,您可以利用HiveContext,您可以利用HiveUD 來計算位數:

結論Spark 提供了多種用於尋找中位數和分位數的選項。方法的選擇取決於資料大小、準確性要求以及 HiveContext 的可用性等因素。

以上是如何在 Apache Spark 中高效計算中位數和分位數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn