val survived_df = df2.filter(col("Survived") === 1) val pclass_survived_count = survived_df.groupBy("Pclass").count() val pclass_survived_percent = pclass_survived_count.withColumn("percent", format_number(col("count") .divide(sum("count").over()) .multiply(100), 5)); pclass_survived_percent.show() 中.divide(sum("count").over())的作用
时间: 2024-03-31 20:36:46 浏览: 10
.divide(sum("count").over()) 的作用是将每个 Pclass 组中的 count 数量除以所有组的 count 数量总和,然后乘以 100,计算出每个 Pclass 组的生存百分比。其中,sum("count").over() 是一个窗口函数,它对整个 DataFrame 进行聚合操作,计算所有组的 count 数量总和。然后,对于每个组,我们可以用该组的 count 数量除以总和,得到该组的百分比。最后,使用 format_number 函数将结果保留小数点后 5 位,并将结果存储在新的列 "percent" 中。这样,我们就可以观察每个 Pclass 组的生存情况,并对不同 Pclass 组之间进行比较。
相关问题
val survived_df = df2.filter(col("Survived") === 1) val pclass_survived_count = survived_df.groupBy("Pclass").count() val pclass_survived_percent = pclass_survived_count.withColumn("percent", format_number(col("count") .divide(sum("count").over()) .multiply(100), 5)); pclass_survived_percent.show() 中sum("count").over()用其他方式替换
如果您想使用其他方式替换 `sum("count").over()`,可以考虑使用 `groupBy` 和 `join` 操作将每个组的 count 数量总和计算出来。具体做法如下:
```
import org.apache.spark.sql.functions.{sum, col}
val total_count = survived_df.select(sum(col("count")).as("total_count")).collect()(0)(0).asInstanceOf[Long]
val pclass_survived_percent = pclass_survived_count.join(broadcast(lit(total_count)).as("total_count")).withColumn("percent", format_number(col("count") / col("total_count") * 100, 5))
```
这里,我们首先使用 `select` 和 `collect` 操作计算出 survived_df 中所有行的 count 数量总和。然后,使用 `join` 操作将每个组的 count 数量总和与 `pclass_survived_count` DataFrame 进行连接,并将连接结果存储在 `pclass_survived_percent` DataFrame 中。最后,使用 `format_number` 函数将每个组的百分比保留小数点后 5 位,并存储在新的列 "percent" 中。
需要注意的是,这种做法的优点是不需要使用窗口函数,因此性能可能会更好。但是缺点是需要进行额外的 `groupBy` 和 `join` 操作,可能会导致代码复杂度和维护成本的增加。因此,在实际应用中,需要根据具体情况进行选择。
val survived_sex_count = df2.groupBy("Sex", "Survived").count() val survived_sex_percent = survived_sex_count.withColumn("percent", format_number(col("count") .divide(sum("count").over()) .multiply(100), 5)); survived_sex_percent.show() 中sum("count").over() 存在问题
对于`sum("count").over()`的问题,这是因为`over()`函数需要指定窗口范围,表示对哪些数据进行求和,而在这里未指定窗口范围,因此报错。
如果想要对每个不同的`Sex`进行比例计算,则需要在`over()`函数中指定分区窗口,以便对每个窗口内的数据进行求和。
可以尝试修改成以下代码:
```
import org.apache.spark.sql.expressions.Window
val windowSpec = Window.partitionBy("Sex")
val survived_sex_percent = survived_sex_count.withColumn("percent", format_number(col("count").divide(sum("count").over(windowSpec)).multiply(100), 5));
survived_sex_percent.show()
```
在这个修改后的代码中,`Window.partitionBy("Sex")`表示按照`Sex`字段进行分区,然后在`over()`函数中指定了窗口范围,表示对每个分区内的数据进行求和。这样就可以正确计算每个分区内存活者的性别分布所占比例,并输出结果。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)