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

代码地址

Spark-Thrift和Spark-SQLSpark框架中的两个组件,它们有以下区别: 1. Spark-SQLSpark的一个模块,用于处理结构化数据,支持SQL查询和DataFrame API。它提供了一种高效且易于使用的方法来处理和分析结构化数据。用户可以使用SQL语句或DataFrame API来查询和操作数据。Spark-SQL允许用户直接在Spark应用程序中使用SQL查询,而无需编写复杂的MapReduce代码。 2. Spark-Thrift是Spark的一个独立服务,它提供了一个标准的Thrift接口,用于执行SQL查询。它可以作为一个独立的进程运行,并通过网络接收来自客户端的SQL查询请求,并将查询转发到Spark集群中的Spark-SQL模块进行处理。Spark-Thrift使得可以使用不同的编程语言,如Java、Python、R等,通过Thrift接口与Spark集群交互。 因此,Spark-SQLSpark框架中用于处理结构化数据的模块,而Spark-Thrift是提供Thrift接口让用户可以使用不同编程语言与Spark-SQL模块交互的独立服务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CDH15.0支持spark-sqlspark-thrift-server](https://blog.csdn.net/u012458821/article/details/87635599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [122.Thrift和spark-sql客户端部署](https://blog.csdn.net/m0_47454596/article/details/126856172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值