在 Apache Spark 中查找中位数和分位数
简介
处理大型数据集时,查找中位数和分位数可能是一项计算成本高昂的任务。 Spark 的分布式计算能力使其非常适合处理此类计算。
Spark 2.0
使用 approxQuantile 进行近似:
Spark 2.0及以上版本提供了approxQuantile方法,该方法利用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>
SQL:
在 SQL 聚合中,可以使用 approx_percentile 函数来估计分位数:
<code class="sql">SELECT approx_percentile(column, 0.5) FROM table;</code>
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>
Hive UDAF:
如果使用 HiveContext,您可以利用 Hive UDAF 来计算分位数:
<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>
结论
Spark 提供了多种用于查找中位数和分位数的选项。方法的选择取决于数据大小、准确性要求以及 HiveContext 的可用性等因素。
以上是如何在 Apache Spark 中高效计算中位数和分位数?的详细内容。更多信息请关注PHP中文网其他相关文章!