Почему Spark приблизительно качественно использует groupBy очень медленно? - PullRequest
1 голос
/ 21 марта 2020

Я хочу рассчитать процентили, используя 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 напрямую сделать это быстрее? как это: { ссылка }

...