spark dataframe 求平均值并保留2位小数
时间: 2023-08-13 17:08:27 浏览: 248
可以使用`agg`函数和`round`函数来求平均值并保留2位小数。以下是一个示例代码:
```python
from pyspark.sql import SparkSession
from pyspark.sql.functions import avg, round
# 创建SparkSession
spark = SparkSession.builder.getOrCreate()
# 创建一个DataFrame
data = [("Alice", 25), ("Bob", 30), ("Charlie", 35)]
df = spark.createDataFrame(data, ["name", "age"])
# 求平均值并保留2位小数
result = df.agg(round(avg("age"), 2).alias("average_age"))
# 显示结果
result.show()
```
输出结果应为:
```
+-----------+
|average_age|
+-----------+
| 30.00|
+-----------+
```
在上面的示例中,我们使用`avg`函数计算了年龄的平均值,然后使用`round`函数将结果保留两位小数。最后,我们使用`alias`方法给结果列命名为"average_age"。
相关问题
def analyse(data: DataFrame): DataFrame = { val spark: SparkSession = data.sparkSession import spark.implicits._ logInfo("/**************** 分析各个用户ID的交易金额最大值、最小值、平均值等信息,按照平均值降序排列 ****************/") val save = udf { x: Double => x.formatted("%.2f") } }
好的,你可以将代码修改为以下形式来实现对 DataFrame 的分析操作并返回一个 DataFrame:
```
def analyse(data: DataFrame): DataFrame = {
val spark: SparkSession = data.sparkSession
import spark.implicits._
logInfo("/**************** 分析各个用户ID的交易金额最大值、最小值、平均值等信息,按照平均值降序排列 ****************/")
// 将原始 DataFrame 按用户 ID 进行分组,并且计算每个用户的交易金额总和、最大值、最小值、平均值等信息
val result = data.groupBy("user_id")
.agg(
sum("amount").as("total_amount"),
max("amount").as("max_amount"),
min("amount").as("min_amount"),
avg("amount").as("avg_amount")
)
// 对结果按照平均值降序排列,并将交易金额保留两位小数
result.select($"user_id", $"total_amount", $"max_amount", $"min_amount", save($"avg_amount").as("avg_amount"))
.orderBy($"avg_amount".desc)
}
```
这段代码使用了 Spark SQL 中的 `groupBy`、`agg` 和 `orderBy` 等函数,对原始的 DataFrame 进行了分组、聚合和排序等操作,并且定义了一个 UDF 函数 `save`,用于将交易金额保留两位小数。最后,该代码返回一个按照用户平均交易金额降序排列的 DataFrame。
阅读全文