Я хочу рассчитать процентили, используя groupBy в Spark Scala, и я последовал за ответом здесь: Как использовать приблизительно количество по группе? . Я использую решение Spark <3.1 </strong>.
Вот моя функция оболочки:
// A wrapper function that can be used in conjunction with groupBy
def percentile_approx(col: Column, percentage: Column, accuracy: Column): Column = {
val expr = new ApproximatePercentile(
col.expr, percentage.expr, accuracy.expr
).toAggregateExpression
new Column(expr)
}
Я использую функцию оболочки для вычисления процентилей:
def calPercentileBoundary(df: DataFrame, percentileMin: Float, percentileMax: Float, percentileInterval: Float, percentileAccuracy: Int): DataFrame = {
df.groupBy("col1", "col2")
.agg(percentile_approx(col("scores"),
typedLit(percentileMin to percentileMax by percentileInterval),
lit(percentileAccuracy))as "boundaries")
}
У меня есть какое-то преобразование в моих исходных данных, затем ему присвоено val df
.
Затем я вызываю вышеуказанную функцию:
val dfBoundaries = calPercentileBoundary(df, 0f, 1f, 0.01f , 10000)
Я записываю кадр данных позже. Я выполнил задание Spark дважды, один раз это заняло всего 4 минуты, в другой раз - 5 раз. Хуже, если данные большие. Мне интересно, что вызывает разницу во времени исполнения. Нужно ли тасовать или переделывать? Кроме того, у меня 500 исполнителей, и у каждого по 2 ядра. Это влияет на работу?
Будет ли переход на использование sql напрямую сделать это быстрее? как это: { ссылка }