Spark |
您所在的位置:网站首页 › 计算销售额占比 › Spark |
先看原数据结构和数据样例
SparkSession spark=SparkSession.builder().master("local[*]").getOrCreate();
Dataset 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 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代码地址 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |