spark-sql 计算某行值占累加总数的百分比

  • 先看原数据结构和数据样例
SparkSession spark=SparkSession.builder().master("local[*]").getOrCreate();

Dataset<Row> table=spark.read().json("src/main/data/transfer_line_count.json");

table.printSchema();
table.show();
root
 |-- from_city_name: string (nullable = true)
 |-- to_city_name: string (nullable = true)
 |-- total_num: long (nullable = true)

+--------------+------------+---------+
|from_city_name|to_city_name|total_num|
+--------------+------------+---------+
|           新乡市|         上海市|        2|
|           南昌市|         天津市|        3|
|           抚州市|         温州市|       36|
|           娄底市|         中山市|        1|
|           广州市|         孝感市|        3|
|           天门市|         岳阳市|        1|
|           长春市|         沈阳市|        6|
|           成都市|         眉山市|       10|
|           广州市|         怀集县|        2|
|           北海市|         广州市|        8|

  • 业务需求

from_city_name开始车票起始城市,to_city_name表示到达城市,
都是group by去重的,total_num表示改线路订单总数.

现在有这样需求,统计每行线路数据到占所有订单总数(sum(total_num))的百分比.

比如在数据样本中,订单总数为

table.agg(sum("total_num")).show();
+--------------+
|sum(total_num)|
+--------------+
|         20000|
+--------------+

比如这个例子中
新乡市->上海市 所占的百分比为 2/20000*100


代码如下

Dataset<Row> result=table.withColumn("percent",format_number(col("total_num").divide( sum("total_num").over()).multiply(100),5));

result.show();

运行结果如下:

+--------------+------------+---------+-------+
|from_city_name|to_city_name|total_num|percent|
+--------------+------------+---------+-------+
|           新乡市|         上海市|        2|0.01000|
|           南昌市|         天津市|        3|0.01500|
|           抚州市|         温州市|       36|0.18000|
|           娄底市|         中山市|        1|0.00500|
|           广州市|         孝感市|        3|0.01500|
|           天门市|         岳阳市|        1|0.00500|
|           长春市|         沈阳市|        6|0.03000|
|           成都市|         眉山市|       10|0.05000|
|           广州市|         怀集县|        2|0.01000|
|           北海市|         广州市|        8|0.04000|
|           商丘市|          曹县|        2|0.01000|
|           册亨县|         罗平县|        1|0.00500|
|           文水县|       鄂尔多斯市|        3|0.01500|
|           赣州市|         广州市|        3|0.01500|
|           枣庄市|         邳州市|        1|0.00500|
|           许昌市|         漯河市|        6|0.03000|
|           柳州市|         南宁市|        3|0.01500|
|           娄底市|         珠海市|        1|0.00500|
|           邵阳市|         永州市|        1|0.00500|
|           山阴县|         太原市|        1|0.00500|
+--------------+------------+---------+-------+
only showing top 20 rows

代码地址

猜你喜欢

转载自blog.csdn.net/baifanwudi/article/details/81589316