Pyspark:将平均值作为新列添加到DataFrame

时间:2017-06-06 06:30:29

标签: python sql apache-spark pyspark

我正在计算数据框中列的平均值,但它导致所有值为零。有人可以帮我解释为什么会这样吗?以下是转换列之前和之后的代码和表。

在计算平均值和添加“平均值”列

之前
var sortedItems = lstTest.OrderBy(o=>o.Quater).ThenByDescending(o=>o.Amount);

计算平均值并添加平均值

之后
result.select("dis_price_released").show(10)
 +------------------+
 |dis_price_released|
 +------------------+
 |               0.0|
 |               4.0|
 |               4.0|
 |               4.0|
 |               1.0|
 |               4.0|
 |               4.0|
 |               0.0|
 |               4.0|
 |               0.0|
 +------------------+

2 个答案:

答案 0 :(得分:2)

您可以先为整列计算avg,然后使用lit()将其作为变量添加到DataFrame,不需要窗函数:

from pyspark.sql.functions import lit

mean = df.groupBy().avg("dis_price_released").take(1)[0][0]
df.withColumn("test", lit(mean)).show()
 +------------------+----+
|dis_price_released|test|
+------------------+----+
|               0.0| 2.5|
|               4.0| 2.5|
|               4.0| 2.5|
|               4.0| 2.5|
|               1.0| 2.5|
|               4.0| 2.5|
|               4.0| 2.5|
|               0.0| 2.5|
|               4.0| 2.5|
|               0.0| 2.5|
+------------------+----+

答案 1 :(得分:0)

这是解决问题的另一种方法

df.withColumn("mean", lit(df.select(avg("dis_price_released").as("temp")).first().getAs("temp"))).show