如何在PySpark数据框中添加一列,其中包含该数据框中另一列的第n个分位数

时间:2019-01-15 02:52:59

标签: pyspark percentile

我有一个很大的CSV文件,它已作为PySpark数据帧导入:df。数据框包含许多列,包括列ireturn。我要计算此列的0.99和0.01百分位数,然后将另一列作为dfnew_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 ....)< / p>

0 个答案:

没有答案