Apache Spark で中央値と分位点を見つける
はじめに
大規模なデータセットを扱う場合、中央値と分位点を見つけることは、計算コストがかかるタスクになる可能性があります。 Spark の分散コンピューティング機能は、このような計算の処理に適しています。
Spark 2.0
aboutQuantile による近似:
Spark 2.0 以降では、Greenwald-Khanna アルゴリズムを利用して効率的な分位点推定を行う近似Quantile メソッドが提供されます。オプションの相対誤差しきい値を使用して、指定された確率 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 集計では、about_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 中国語 Web サイトの他の関連記事を参照してください。