订单表order,字段有:order_id(订单ID), user_id(用户ID),amount(金额), pay_datetime(付费时间),channel_id(渠道ID),dt(分区字段)

本文介绍了如何在Hive中创建表,包括分区和格式设置,并通过SQL查询分析2021年8月4日的数据,如订单数量、用户量和总金额。还探讨了发现订单数据重复的原因,推测可能源于数据迁移错误。

1)在Hive中创建这个表

create external table order(
    order_id int,
    user_id int,
    amount double,
    pay_datetime timestamp,
    channel_id int
) partitioned by (dt string)
row format delimited fields terminated by '\t';

2)查询dt=‘2021-08-04‘里每个渠道的订单数,下单人数(去重),总金额

select channel_id,
       count(order_id) `订单数`,
       count(distinct user_id) `下单人数`,
       sum(amount) `总金额`
from order
where dt = '2021-08-04'
group by channel_id

3)查询dt=‘2021-08-04‘里每个渠道的金额最大3笔订单

select channel_id,
       order_id,
       amount,
       rank
from (
    select channel_id,
           order_id,
           amount,
           rank() over(partition by channel_id order by amount desc) `rank`
    from order
    where dt = '2021-08-04'
    group by channel_id,order_id,amount
) t1
where t1.rank <= 3

4)有一天发现订单数据重复,请分析原因

订单属于业务数据,在关系型数据库中不会存在数据重复,hive建表时也不会导致数据重复,所以我推测是在数据迁移时,失败导致重复迁移,从而出现数据冗余的情况

为“小型电商平台(日活1万用户,日均订单5000)”设计核心数据库表结构,要求:①业务需求分析(用户模块[注册/登录/个人信息]、商品模块[商品信息/分类/库存]、订单模块[下单/支付/物流]、评价模块[商品评价/评分]);②核心表定义(用户表[user_id(PK)/username/phone/email/password_hash/register_time/status],字段类型:user_id INT主键自增,phone VARCHAR(20)唯一索引;商品表[goods_id(PK)/name/category_id(FK)/price/stock/sales/created_time],索引:category_id普通索引,name全文索引;订单表[order_id(PK)/user_id(FK)/total_amount/pay_status/pay_time/ship_time/status],索引:user_id+create_time联合索引;订单项表[item_id(PK)/order_id(FK)/goods_id(FK)/quantity/price],复合主键(order_id, goods_id);评价表[comment_id(PK)/order_id(FK)/goods_id(FK)/user_id(FK)/score/content/create_time],索引:goods_id+score联合索引);③关系图描述(用户表1对多订单表[user_id];商品表1对多订单项表[goods_id];订单表1对多订单项表[order_id];订单表1对多评价表[order_id],附各表关系箭头及基数);④性能优化设计(分表策略:订单表时间分表[每月1张];索引优化:避免过度索引,仅保留查询频繁字段;缓存设计:热门商品库存/用户信息缓存至Redis,过期时间10分钟;事务设计:下单流程[扣库存+创建订单]用事务保证原子性,防止超卖)
08-28
我们订单表,支付表一般是存储在Mysql中,通过DataX进行增量的拉取,根据字段update_time进行每天的同步增量拉取的然后存储在HDFS上的, 也就是ODS层嘛,保留原系统的字段原貌,按照日期分区,便于增量处理 订单表(ods_orderorder_id user_id order_amount order_time order_status create_time channel dt 订单ID 用户ID 订单金额 下单时间 订单状态 0-已取消 1-已完成 订单创建时间 (原始时间) 下单渠道 APP 小程序 线下门店 分区字段 支付表(ods_payment) order_id pay_status pay_time dt 订单ID 支付状态(0-未支付,1-已支付) 支付时间时间戳) 分区字段 -- 每日监控数据量波动 Select count(*) FROM ods_order where dt='日期' -- 对比昨日波动超过±10%触发告警 数据从ODS层到DWD层进行一个数据清洗,构建交易事实表,关联订单与支付信息表,为上层提供一个干净,规范的明细数据,对异常金额以及乱码地址进行处理,然后再将常用的维度冗余到事实表中,较少后续的join开销。 订单实时表(dwd_trans_order_fact) order_id user_id order_amount order_time channel pay_status pay_time create_time_utc is_test dt 订单ID 用户ID 订单金额(清洗后,如过滤负值) 下单时间 下单渠道(冗余常用维度) 支付状态(非空校验,过滤脏数据) 支付时间(关联支付表获取) 统一时间格式 测试订单标记(通过user_id白名单过滤) 分区字段 CREATE TABLE dwd_trans_order_fact AS SELECT o.order_id, o.user_id, o.order_amount, o.order_time, p.pay_status, p.pay_time, -- 统一时间格式为UTC FROM_UNIXTIME(o.create_time) AS create_time_utc, -- 标记测试订单 CASE WHEN o.user_id IN (test_user_list) THEN 1 ELSE 0 END AS is_test FROM ods_order o LEFT JOIN ods_payment p ON o.order_id = p.order_id WHERE o.dt = '2023-01-01' AND o.order_status IN (0, 1) -- 有效订单状态 AND p.pay_status IS NOT NULL -- 排除未关联支付的脏数据 dwd_trans_order_fact 以字段dt进行分区,以ORC的格式存储在HDFS上,同时确保订单与支付记录1:1对应 数据从DWD层到DWS层按照业务需求进行聚合,构建交易域轻度汇总模型,提升查询的一个效率,同时我们在这一层也做了预计算,将复杂条件(如支付状态判断)提前在DWS层计算,避免数据到ADS层重复处理。然后多维度预聚合,按照渠道用户等级,商品的类目等多维度组合预聚合,支持灵活下钻 每日订单汇总表(dws_trans_order_daily) dt channel total_orders paid_orders 日期(分区字段渠道(APP/小程序/线下门店) 总订单数 count(distinct order_id) 支付成功订单(count(distinct case when pay_status=1 then order_id end)) CREATE TABLE dws_trans_order_daily ( dt STRING COMMENT '日期', channel STRING COMMENT '渠道', total_orders BIGINT COMMENT '总订单数', paid_orders BIGINT COMMENT '支付成功订单数' ) PARTITIONED BY (dt) STORED AS ORC; INSERT OVERWRITE TABLE dws_trans_order_daily PARTITION(dt='2023-01-01') SELECT channel,
03-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值