大数据(8l)运费分摊

Spark实时项目第八天-DWS层订单明细实付金额分摊(双流合并) 需求 主订单的应付金额【origin_total_amount】一般是由所有订单明细的商品单价数量汇总【sku_pricesku_num】组成。 但是由于优惠、运费等都是以订单为单位进行计算的,所以减掉优惠、加上运费会得到一个最终实付金额【final_total_amount】。 但问题在于如果是以商品进行交易额分析,也要把优惠、运费的效果分摊到购买的每个商品中。 如何分摊 一般是由订单明细每种商品的消费占总订单的比重进行分摊,比如总价1000元的商品, 由分别由600元和400元的A、B两种商品组成, 但 阅读详情

问题描述

  • 电商场景中,优惠、运费等是以订单为单位进行计算的
  • 若要以商品维度进行分析,就要把优惠、运费等的效果分摊到每个商品
  • 分摊方法:
    分 摊 比 重 = 每 种 商 品 的 金 额 商 品 总 额 分摊比重=\frac{每种商品的金额}{商品总额} 分摊比重=商品总额每种商品的金额​
  • 问题来了,由于除法有时除不尽,导致合计有差
  • 改进方法:
    最 后 一 种 商 品 分 摊 比 重 = 1 − 其 它 分 摊 比 重 累 加 最后一种商品分摊比重 = 1 - 其它分摊比重累加 最后一种商品分摊比重=1−其它分摊比重累加
  • 判断是否最后一种商品:
    商 品 总 额 − 已 经 分 摊 的 商 品 金 额 累 加 = = 商 品 金 额 商品总额 - 已经分摊的商品金额累加 == 商品金额 商品总额−已经分摊的商品金额累加==商品金额

Python实现

运费分摊

data = [
    ('a1', ['牛奶', '坚果', '蛋糕'], [30, 30, 30], 10, 100),
    ('a2', ['酸奶', '坚果', '蛋糕'], [60, 60, 60], 20, 200),
]

for 订单号, 订单商品, 订单商品金额, 运费, 订单总额 in data:
    商品总额 = 订单总额 - 运费
    已经分摊的商品金额累加 = 0
    运费分摊累加 = 0
    # 遍历每个商品,计算【运费分摊】
    for 商品, 商品金额 in zip(订单商品, 订单商品金额):
        # 判断是否为最后一个商品
        if 商品总额 - 已经分摊的商品金额累加 == 商品金额:
            运费分摊 = 运费 - 运费分摊累加
        else:
            运费分摊 = round(商品金额 / 商品总额 * 运费, 2)
            已经分摊的商品金额累加 += 商品金额
            运费分摊累加 += 运费分摊
        print(订单号, '\033[033m', 商品, 商品金额, 运费分摊, '\033[0m', 运费, 订单总额)

运费和优惠分摊

data = [
    ('a1', ['牛奶', '坚果', '蛋糕'], [30, 30, 30], 10, 20, 80),
    ('a2', ['酸奶', '坚果', '蛋糕'], [60, 60, 60], 20, 40, 160),
]

for 订单号, 订单商品, 订单商品金额, 运费, 优惠, 订单总额 in data:
    商品总额 = 订单总额 - 运费 + 优惠
    已经分摊的商品金额累加 = 0
    运费分摊累加 = 0
    优惠分摊累加 = 0
    # 遍历每个商品,计算【运费分摊】
    for 商品, 商品金额 in zip(订单商品, 订单商品金额):
        # 判断是否为最后一个商品
        if 商品总额 - 已经分摊的商品金额累加 == 商品金额:
            运费分摊 = 运费 - 运费分摊累加
            优惠分摊 = 优惠 - 优惠分摊累加
        else:
            已经分摊的商品金额累加 += 商品金额
            运费分摊 = round(商品金额 / 商品总额 * 运费, 2)
            运费分摊累加 += 运费分摊
            优惠分摊 = round(商品金额 / 商品总额 * 优惠, 2)
            优惠分摊累加 += 优惠分摊
        print(订单号, '\033[033m', 商品, 商品金额, 运费分摊, 优惠分摊, '\033[0m', 运费, 优惠, 订单总额)

打印

HIVE实现

--删库
DROP DATABASE IF EXISTS sale CASCADE;
--建库
CREATE DATABASE sale LOCATION '/sale';
USE sale;
--建表
CREATE TABLE good(
order_number    STRING COMMENT "订单号",
good            STRING COMMENT "商品",
good_costs      INT    COMMENT "商品金额",
goods_costs     INT    COMMENT "商品总额",
transport_costs INT    COMMENT "运费",
costs           INT    COMMENT "订单总额"
)COMMENT "商品分析"
LOCATION '/sale/good';
--插数据
INSERT INTO TABLE good VALUES
('a1','牛奶',3000,9000,1000,10000),
('a1','坚果',3000,9000,1000,10000),
('a1','蛋糕',3000,9000,1000,10000),
('a2','酸奶',6000,18000,2000,20000),
('a2','坚果',6000,18000,2000,20000),
('a2','蛋糕',6000,18000,2000,20000);
--查看
SELECT * FROM good;

good1

CREATE VIEW good1 AS
SELECT
    *,
    SUM(good_costs) OVER(PARTITION BY order_number ORDER BY good)
        AS good_accumulation,  -- 累计商品金额
    ROUND(good_costs/goods_costs*transport_costs)
        AS transport_share     -- 分摊运费
FROM good;

good2

CREATE VIEW good2 AS
SELECT
    *,
    SUM(transport_share) OVER(PARTITION BY order_number ORDER BY good)
        AS transport_share_accumulation  -- 累计分摊运费
FROM good1;

good3

CREATE VIEW good3 AS
SELECT
    *,
    IF(goods_costs==good_accumulation,transport_costs-transport_share_accumulation+transport_share,transport_share)
        AS transport_share_final         -- 最终分摊运费
FROM good2;

123合体

SELECT
    *,
    IF(
        goods_costs==good_accumulation,
        transport_costs-transport_share_accumulation+transport_share,
        transport_share)
        AS transport_share_final         -- 最终分摊运费
FROM (
    SELECT
        *,
        SUM(good_costs) OVER(PARTITION BY order_number ORDER BY good)
            AS good_accumulation,  -- 累计商品金额
        ROUND(good_costs/goods_costs*transport_costs)
            AS transport_share,    -- 分摊运费
        SUM(ROUND(good_costs/goods_costs*transport_costs))
            OVER(PARTITION BY order_number ORDER BY good)
            AS transport_share_accumulation  -- 累计分摊运费
    FROM good
)t;

Spark实现

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object Hello {
  def main(args: Array[String]): Unit = {
    // 创建SparkSession对象
    val c1: SparkConf = new SparkConf().setAppName("a1").setMaster("local[*]")
    val spark: SparkSession = SparkSession.builder().config(c1).getOrCreate()
    // 隐式转换支持
    import spark.implicits._
    // 创建数据
    val df = Seq(
      ("a1", "牛奶", 3000, 9000, 1000, 10000),
      ("a1", "坚果", 3000, 9000, 1000, 10000),
      ("a1", "蛋糕", 3000, 9000, 1000, 10000),
      ("a2", "酸奶", 6000, 18000, 2000, 20000),
      ("a2", "坚果", 6000, 18000, 2000, 20000),
      ("a2", "蛋糕", 6000, 18000, 2000, 20000)
    ).toDF("order_number", "good", "good_costs", "goods_costs", "transport_costs", "costs"
    ).sort("order_number")
    // 创建视图
    df.createTempView("good")
    // 累计商品金额、分摊运费、累计分摊运费
    spark.sql(
      """
        |SELECT
        |    *,
        |    SUM(good_costs) OVER(PARTITION BY order_number ORDER BY good)
        |        AS good_accumulation,  -- 累计商品金额
        |    ROUND(good_costs/goods_costs*transport_costs)
        |        AS transport_share,    -- 分摊运费
        |    SUM(ROUND(good_costs/goods_costs*transport_costs))
        |        OVER(PARTITION BY order_number ORDER BY good)
        |        AS transport_share_accumulation  -- 累计分摊运费
        |FROM good
        |""".stripMargin).createTempView("good1")
    // 最终分摊运费
    spark.sql(
      """
        |SELECT
        |    *,
        |    IF(
        |        goods_costs==good_accumulation,
        |        transport_costs-transport_share_accumulation+transport_share,
        |        transport_share)
        |        AS transport_share_final         -- 最终分摊运费
        |FROM good1;
        |""".stripMargin).show()
  }
}

结果打印

【审计专栏】【企业管理】【市场体系】第六篇 市场营销与产品定价01 以下是对市场营销理论体系的分级分类全景图,以为核心脉络,涵盖从工业时代的经典框架到数字智能时代的整合系统。今天的营销实践,:运用分析宏观与竞争环境。:通过确定目标市场与核心价值主张,用确立在心智中的独特位置。:制定建设目标,规划与核心体验。:基于定位设计信息矩阵。:运用框架设计具体的产品、服务、价格、渠道和传播方案。:构建技术栈,支撑。:通过创造价值,在上互动。:运用思维,围绕进行快速实验和优化。:利用系统,实施策略,提升顾客忠诚度。:监控等核心指标。 阅读详情

相关推荐

【管理科学】【金融工程】第三十三篇 企业金融资产(含股票/债券)/固定资产 管理01

编号企业性质行业企业规模企业能力模型配方算法/模型名称数据结构列表算法逐步思考推理的数学方程式及参数列表及参数的值范围时序数学方程式误差/算法复杂度底层规律和理论关系知识和法律法规1民营制造企业制造业中型现金流预测与流动性管理时序预测+统计回归LSTM (长短期记忆网络) + ARIMA, , , , ARIMA(p,d,q): 其中: B: 滞后算子; d∈[0,2] (差分阶数); p∈[0,5]; q∈[0,5]; θ为移动平均系数 ∈[-1,1] LSTM:

weixin_49199313的博客 383

(61).订单明细实付金额分摊实现

4.1 需求分析 主订单的应付金额【origin_total_amount】一般是由所有订单明细的商品单价*数量 汇总【order_price*sku_num】组成。 但是由于优惠、运费等都是以订单为单位进行计算的,所以减掉优惠、加上运费会得到 一个最终实付金额【 final_total_amount】。 但问题在于如果是以商品进行交易额分析,就需要把优惠、运费分摊到购买的每个商品 中。 4.2 如何分摊 一般是由订单明细每种商品的消费占总订单的比重进行分摊,比如总价 1

song_quan_的博客 4499

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 01

算法设计

weixin_49199313的博客 1504

电商平台之运费分摊算法

下单的过程中我们会根据配送方式的不同来计算相应的运费,并将每个商品分摊到的运费金额放到订单的items表里,如果按照相应的比例进行分摊,就会存在四舍五入的小数分摊不均,比如10元运费3件商品,每个就会分摊到3.33,这样就会有0.01的误差存在,为了避免这样的误差存在,我们会记录下前几次分摊到的金额值总和,最后一个用总运费金额减去之前的总和,这样减避免了误差的存在。订单发生退货的时候就会根据退货数...

daxiaoge111的博客 7599

【管理科学】第三十五篇 企业经营中的管理科学01 权力、风险、运营、物流、人力资源、库存、合同、品牌、业绩、项目

编号类型领域子领域/内容问题问题的数学分析(电磁/信息论/数学物理/数学化学/界面科学/表面科学 + 几何/拓扑/代数/集合论/图论/数论/函数评估/数值估计/概率/统计/向量/张量/矩阵/矢量 + 其他)算法逐步推理思考的数学表达式及实现步骤及时序流程 参数列表及参数的数值范围及数值分析及常量/常数1管理科学问题运营管理生产计划如何分配有限资源生产多种产品以最大化利润?线性代数、凸优化、单纯形法;向量与矩阵目标函数 max c^T x,约束 Ax ≤ b, x ≥ 0。步骤:①标准化引入松弛变量;②构建初

weixin_49199313的博客 248

【财务领域】第五十五篇 企业金融运作、账务操作及运作、会计操作及运作、税务操作和运作、资本运作、账期管理01

编号类型领域行业企业性质企业类型问题账款和账务和税-利润管理的数学方程式列表及参数列表及参数的数值范围关联知识和法律法规和行业标准规定1财务管理账款管理通用通用通用应收账款周转率计算方程式:应收账款周转率 = 赊销收入净额 / 平均应收账款余额 参数:赊销收入净额(≥0,单位万元),平均应收账款余额(≥0,单位万元) 数值范围:周转率通常介于3~30之间,视行业而定《企业会计准则第14号——收入》;《企业财务通则》2财务管理账务处理通用通用通用流动比率计算方程式:流动比率 = 流动资产 / 流动

weixin_49199313的博客 288

数仓之订单详情事实表【价格分摊】

数仓之订单详情事实表[价格分摊] 1.创建订单详情事实表 drop table if exists dwd_fact_order_detail; create external table dwd_fact_order_detail ( `id` string COMMENT '订单编号', `order_id` st

ChinaKF_DrEam的博客 2473

【信息科学与工程学】【管理科学】第七十二篇 管理层相对基层员工的信息差/资源差/权力差/认知差01

​ CTO调用Vlong−term​,Rstrategic​,Ppolitical​等高层级参数,重新计算Clevel​(X)。​ 将A部门经理对B部门员工的负面评价,在合适的时机透露给B部门经理,激化部门矛盾,HR总监则作为调解者介入,提升话语权。​ 信息经过VP、总监、经理逐级传递,每一级因自身利益、理解偏差、沟通技巧产生噪声,最终形成基层员工的Ei​(t2)。​ 在A面前说B对他有意见,在B面前说A对他的工作配合不力,让两人互相猜忌,PM则成为唯一的信息枢纽和仲裁者。

weixin_49199313的博客 94

mysql8 hive oracle 窗口函数,分摊金额

注:技术交流可以加我VX:k-loop,昵称:默读者。 需求: 一个订单2000块钱对应4个子订单,这笔订单优惠了200块钱,然后将200块钱需要根据子订单的金额/订单2000块钱,进行分摊。但是最后一笔,需要用200-之前3比分摊出去的金额,这样4笔子订单加一块才是200元。 -- 创建订单表 create table `order`( id int, -- 订单id price DOU...

licai_1001的博客 1113

【信息科学与工程学】【数据科学】 第四十四篇 数据湖 系列二 函数库01

2. 近似最近邻搜索(ANN): 通过HNSW等图索引模型加速,模型定义为构建一个层次化导航小世界图。依赖于消息队列(Kafka/Pulsar)、分布式文件系统(HDFS/S3)的客户端及连接库。依赖专门的向量检索库(如FAISS, Milvus)。管控目标: 召回率(Recall@K) > 95%,查询延迟 < 100ms。管控目标: < 1% (核心业务字段) 或 < 5% (一般字段)依赖数据处理框架(如Spark, Pandas)的核心统计函数。,通过牺牲精确性(ANN)来换取搜索速度的大幅提升。

weixin_49199313的博客 347

深入解析Zynq Ultrascale+ RF Data Converter中的PLL配置与时钟管理

本文深入解析了Zynq Ultrascale+ RF Data Converter中PLL配置与时钟管理的核心原理与实践。文章将RFDC时钟系统比作交响乐团,详细阐述了PLL作为指挥的关键作用,以及系统时钟、Tile时钟、参考时钟与采样时钟的层级关系。重点剖析了PLL配置参数(如VCO频率、分频器设置)的计算方法与稳定性考量,并提供了从IP配置使能顺序到多Tile同步、DRP访问等常见问题的实战避坑指南与调试技巧,帮助工程师构建稳定的射频信号处理基石。

7up55的博客 452

第三十七篇 高级事实表设计核心技术全解:关键策略与实战指南

在电商大促期间因运费分摊错误导致利润数据偏差40%,某企业被迫通宵修复数据管道——这是事实表设计不当的典型代价。本文将系统解析13个高级事实表核心技术,涵盖金融、物流、跨国业务等复杂场景,提供可直接落地的解决方案。:我是[随缘而动,随遇而安], 一个喜欢用生活案例讲技术的开发者。:你在学习SQL时遇到过哪些坑?欢迎评论区留言讨论!某银行因核心系统升级,原交易流水号。,导致历史数据关联断裂。

qq_39991788的博客 1071

xilinx zynq-7000 linux下rs422串口通信测试步骤

这几天使用xilinx的zynq-7000系列调试rs422串口,期间遇到不少问题,好在最终调试完成,在这里记录一下调试步骤。 我用的soc型号是xc7z100,板载了2个rs422外设,PS端有2个uart控制器,uart0用于连接rs232并作为console控制台输出,uart1连接rs422。 rs422和主板连线原理图如下: 其中422_TXD1_3V3 和422_RXD1_3V3 为数据发送和接收引脚,422_TXD_DE1_3V3为发送使能引脚,422_RXD_REn1_...

dongyunke的博客 5907

跨境电商ERP的核心概念的庖丁解牛

维度核心概念关键公式/逻辑价值业务SKU 映射本地 SKU ↔ 平台 SKU统一管理,一变俱变库存可用库存物理 - 锁定 - 预留防超卖,保账号订单状态机平台状态 ↔ ERP 统一状态流程标准化,自动化财务全成本核算营收 - (采购 + 物流 + 佣金 + 广告)算清利润,决策依据供应链智能补货销量 × 周期 + 安全 - 现有 - 在途不断货,不积压架构多租户 + 异步tenant_id+ Queue安全隔离,高性能终极心法跨境电商 ERP 不是软件,是“生意的数字化双胞胎”。

长风破浪会有时的博客 530

LLM and Embedding区别

LLM(大语言模型)和 Embedding(嵌入)是自然语言处理(NLP)中的两个核心概念,它们的核心区别在于。Embedding 计算向量。

u010674101的专栏 1877

OCR开发车架号识别vin码识别系统

一、vin码识别车架号识别系统简介   vin码识别车架号识别系统,结合VIN码主机厂数据库及自身多年文字识别经验,针对机动车配置参数等信息的查询及采集业务推出的一款VIN码自动识别产品。   车架号识别vin码识别,主要应用在智能手机IOS与Android两个平台中。前端扫描查询模式,无需联网,只需扫描汽车前挡风玻璃右下角的VIN玛(车架号),即可轻松识别出车辆产地、品牌、车

OCR13512721355的博客 1434

企业AI落地核心:如何让AI真正‘能查数据’

在企业数字化转型中,‘能查数据’已成为AI从概念走向实用的关键分水岭。它不仅涉及数据库连接与SQL生成等技术原理,更深层考验的是业务语义理解、跨系统权限协同与模糊需求的确定性翻译能力。技术价值在于将自然语言查询稳定、精准、低延迟地转化为可信结果,支撑销售晨会、财务月结、运维巡检等高频业务场景。典型应用包括ERP订单追溯、医保结算字段识别、连锁门店缺货归因等真实工作流。本文聚焦‘能查数据’背后的数据源适配、查询生成、结果解释与反馈闭环四层技术栈,结合字段语义词典、时间上下文感知、权限穿透处理等实战方案,直击工

weixin_34194359的博客 396

在ubuntu上安装FastSufer【本机安装】

其实说是安装,只需要将文件下载并解压即可。推荐教程注意版本:在下面这个网址根据你的操作系统找到最新的版本安装。比如我的操作系统为Ubuntu 20.04.5,因此我安装ubuntu20-7.4.1的freesurfer打开~/.bashrc在~/.bashrc文件中添加以下三行关闭~/.bashrc更新~/.bashrc安装tcsh注意每次进入终端使用freesurfer时需要输入FREESURFER_HOME路径根据freesurfer的文件夹所在位置自己修改。

Xingwen_future的博客 2009

商城订单使用优惠卷价格计算逻辑,举例计算

订单使用优惠卷价格计算逻辑,并举例说明

weixin_49234845的博客 7281

Python 爬虫实战:微博自动化运营工具(点赞 / 转发 / 评论 + 反封号策略)

微博作为中国最大的社交媒体平台之一,拥有庞大的用户群体和丰富的数据资源。通过 Python 爬虫技术,我们可以实现微博的自动化运营,包括点赞、转发、评论等功能,同时采取有效的反封号策略,确保账号的安全和稳定运行。

u014481728的博客 1179

CAPL诊断功能实现

UDS(Unified Diagnostic Services)是一种用于汽车电子系统诊断的标准协议。它定义了一系列诊断服务,用于读取和写入车辆电子控制单元(ECU)中的数据,以及处理诊断故障码(DTC)。UDS协议通常运行在CAN总线上,使用ISO 15765-2(ISO-TP)协议进行数据传输。通过本文的学习,读者应该对CAPL诊断功能实现有了初步的了解,并能够编写复杂的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1517

商城运费模板数据库简单设计思路

1.数据库结构 2.后台表单设计 转载于:https://blog.51cto.com/14210437/2383873

weixin_34168880的博客 4052

VTK-9.5.0 1D2D3DWidget实现灰度图+深度图+3D点云显示(可轻松集成到自己的项目)

VTK1D2D3DWidget是一个基于Qt和VTK开发的3D点云可视化工具,支持RGB和深度点云数据的显示与处理。主要功能包括点云加载、可视化、保存为PLY格式文件,以及背景颜色、点间隔、坐标轴显示等参数的自定义设置。该工具采用模块化设计,核心组件包括主窗口管理类、VTK渲染组件和自定义鼠标交互样式,依赖Qt5+和VTK9.5.0库实现跨平台支持。项目提供完整的源码和构建指南,适用于点云数据的快速展示与分析。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 389

一条SQL实现数据分摊

这个也是比较经典的数据分摊的问题。 举个例子: 例如有一个总金额:5000 按照一定的顺序分摊给一堆明细记录: RN        DEPTNO        EMPNO        SAL 1        20         7369         800 2        20        7566         2975 3        20        778

samt007的Blog 8270

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C语言:快递费用计算

头歌·C语言练习

醉蕤的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 大数据(5a)HBase入门:安装、读写、架构、数据视图、数据模型
下一篇: Python工程师Java之路(b)IntelliJ IDEA
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值