Вы можете выбрать исключение выбросов перед запуском вашего процентиля (хотя имейте в виду, что PERCENTILE
как функция - отличный способ справиться с выбросами.
В любом случае, чтобы сократить хвосты вашего распределения , вы можете применить некоторые операции фильтрации.
Сначала создайте разделение окна:
import org.apache.spark.sql.expressions.Window
val byGroup = Window.partitionBy(lit(1))
Затем вырежьте все, что больше 1,96:
val results = spark.sql("""SELECT value FROM table """)
.withColumn("mn", avg($"value") over byGroup)
.withColumn("v", var_pop($"value") over byGroup)
.filter( $"mn" + lit(1.96) * $"v" >= $"value" )
.filter( $"mn" - lit(1.96) * $"v" <= $"value" )
Это должно сократить 5% распределения на каждой стороне хвоста. Смотрите здесь для получения дополнительной информации: https://en.wikipedia.org/wiki/1.96
Скриншот: