Как добавить столбец в фрейм данных PySpark, который содержит n-й квантиль другого столбца в фрейме данных - PullRequest
0 голосов
/ 15 января 2019

У меня есть очень большой CSV файл, который был импортирован как фрейм данных PySpark: df. Кадр данных содержит много столбцов, включая столбец ireturn. Я хочу вычислить 0,99 и 0,01 процентиля этого столбца, а затем добавить еще один столбец к фрейму данных df как new_col_99 и new_col_01, который содержит 0,99 и 0,01 процентиля соответственно. Я написал следующие коды, которые работают для небольших фреймов данных, но я получаю некоторые ошибки, когда применяю их для своего большого фрейма данных.

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df = spark.read.csv("name of the file", inferSchema = True, header = True)


precentile_99 = df.selectExpr('percentile(val1, 0.99)').head(1)[0][0]
precentile_01 = df.selectExpr('percentile(val1, 0.01)').head(1)[0][0]
from pyspark.sql.functions import lit
df = df.withColumn("new_col_99", lit(precentile_99))
df = df.withColumn("new_col_01", lit(precentile_01))

Как я уже сказал, он работает для небольших фреймов данных, но не работает для больших. Я также заменил head на collect, и это не сработало. Я получаю ошибку ниже:

Logging error ---
ERROR:py4j.java_gateway:An error occurred while trying to connect to the Java server (127.0.0.1:49850)
Traceback (most recent call last):...

Некоторое обновление: Я пробовал также следующие коды:

percentile = df.approxQuantile('ireturn',[0.01,0.99],0.25)
df = df.withColumn("new_col_01", lit(percentile[0]))
df = df.withColumn("new_col_99", lit(percentile[1]))

Блок кодов, приведенный выше, работает около 15-20 минут, но вычисление неверно (мои данные в столбце ireturn меньше 1, но возвращает 0,99 процентиля как 6789 ....)

...