我有一个非常大的CSV文件,已经作为PySpark dataframe导入:
我试图用
df
。数据框包含许多列,包括列ireturn
。我想计算该列的0.99和0.01百分位数,然后将另一列添加到dataframe 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))
我试图用
collect
替换head
,但也没有起作用。我收到了以下错误信息:
我还尝试了以下方法:记录错误 ---
错误:py4j.java_gateway:尝试连接Java服务器(127.0.0.1:49850)时发生错误
跟踪(最近的调用):...
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....)
percentile_approx
。 - martinarroyo