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 16:36:46 浏览: 8
这取决于您的具体需求。在这个场景中,如果您需要计算每个组的百分比,那么使用 `divide(sum("count").over())` 是一个比较常见的做法,而且这种做法也是比较有效的。因此,如果您的需求和这个场景类似,那么就没有必要替换 `divide(sum("count").over())`,可以直接使用这个表达式来计算每个组的百分比。如果您有其他的需求,可以具体说明,这样我才能更好地为您解答。
相关问题
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)