1. ホーム
  2. scala

[解決済み] Spark - Sparkでパーセンタイルを計算する方法は?

2022-02-18 14:06:54

質問

1列のデータフレームから0.8パーセンタイルを取得しようとしていました。私はこの方法で試してみました。

val limit80 = 0.8
val dfSize = df.count()
val perfentileIndex = dfSize*limit80 

dfSorted = df.sort()
val percentile80 = dfSorted .take(perfentileIndex).last()

しかし、大きなデータフレームの場合、異なるノードに分散される可能性があるので、これは失敗すると思います。

パーセンタイルを計算するために何か良い方法はないでしょうか? df.take(index) は、ノード内のパーティションだけでなく、本当にデータセット全体を考慮することになります。

どのように解決するのですか?

Spark 2.xの場合、以下のようになります。 approxQuantile のようになります。

val df = Seq(
  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  20, 21, 22, 23, 24, 25, 26, 27, 28, 29
).toDF("num")

df.stat.approxQuantile("num", Array(0.8), 0.1)
// res4: Array[Double] = Array(26.0)

第3パラメータが小さいほど relativeError となり、計算が高くなります。 以下はAPIドキュメントに記載されている関連事項です。

相対エラー : 達成すべき相対的な目標精度(大 または0に等しい)。 0に設定すると,正確な分位数が計算される。 これは非常に高価になる可能性があります。