Spark - كيف تحسب النسبة المئوية في Spark؟

1

كنت أحاول الحصول على 0.8 بالمائة من عمود بيانات واحد. حاولت بهذه الطريقة:

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

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

لكني أعتقد أن هذا سيفشل بالنسبة إلى إطارات البيانات الكبيرة ، حيث قد يتم توزيعها عبر العقد المختلفة.

هل هناك طريقة أفضل لحساب النسبة المئوية؟ أو كيف يمكنني الحصول على جميع صفوف dataframe في نفس الجهاز (حتى لو كان هذا مضادًا للنمط) لذا df.take(index) سيأخذ في الاعتبار مجموعة البيانات بأكملها وليس مجرد قسم في العقدة.

2 الاجابة

7
افضل جواب

بالنسبة إلى Spark 2.x ، يمكنك استخدام تقريباًQuantile ، كما في المثال التالي:

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)

لاحظ أن أصغر المعلمة الثالثة relativeError أكثر تكلفة الحساب. إليك ملاحظة ذات صلة في مستند API:

relativeError: The relative target precision to achieve (greater than or equal to 0). If set to zero, the exact quantiles are computed, which could be very expensive.

:مؤلف
1
افضل جواب

مع مجموعات البيانات الكبيرة ، ربما يجب عليك اتباع نهج تقريبي

import org.apache.spark.sql.functions.{callUDF, lit}

df.agg(callUDF("percentile_approx", $"someColumn", lit(0.8)).as("percentile80"))
:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام