业务场景说明:假设客户在我司系统中存在唯一的标示为客户号(CLIENT_NO),客户在向我司投保时,会产生一笔保单,这笔保单的唯一标示为保单号(POLICY_NO),保单信息中包括了保险开始时间(INSURE_BEGIN_DATE)与结束时间(INSURE_END_DATE),以及需要支付的保费(ACTUAL_PREMIUM)。以下是改流程主要涉及到的三张表。请了解表结构以及数据情况并作答:
一、客户信息标表:DWD_CUSTOMER_BASE
- 表结构
字段英文 | 类型 | 字段中文名 |
---|---|---|
CLIENT_NO | STRING | 客户名 |
CLIENT_NAME | STRING | 客户名称 |
ORGANIZATION_TYPE | STRING | 企业类型 |
RAW_REGIST_CAPI | BIFINT | 注册资本(万元) |
REGIST_DATE | TIMESTAMP | 注册时间 |
COMPANY_ADDRES | STRING | 注册地址 |
- 表数据采集
CLIENT_NO | CLIENT_NAME | ORGANIZATION_TYPE | RAW_REGIST_CAPI | REGIST_DATE | COMPANY_ADDRES |
---|---|---|---|---|---|
P03343342 | 锡山区安镇尚捞火锅店 | 个体工商户 | 3 | 2018-04-11 | 无锡市锡山区安镇街道孟家苑小区 |
P03234356 | 七台河市罗马假日婚纱影城 | NULL | NULL | 2017-05-12 | 黑龙江省七台河市桃山区太同街 |
P03234358 | 榆林市横山区电力局党岔供电局 | 事业单位 | 10 | 1999-04-15 | 陕西省榆林市横山县党岔镇党岔本村 |
P03334358 | h汉中市投资控股集团有限公司 | 国有企业 | 1000000 | 2017-05-26 | s陕西省汉中市汉台区讲坛西路 |
P03335358 | 一丁控股有限公司 | 民营企业 | 5000 | 2008-03-18 | 福州市台江区五一中路169号利嘉 |
P03345358 | 一九零五(北京)网络科技有限公司 | 民营企业 | 3000 | NULL | 北京市西城区北展北街3层5#301 |
二、客户保单关联关系表:DWD_CUSTOMER_REL
- 表结构 表数据采样
字段英文 | 类型 | 字段中文名 | CLIENT_NO | POLICY_NO | ROLE_TYPE |
---|---|---|---|---|---|
CLIENT_NO(业务主键) | STRING | 客户号 | P03343342 | ||
STRING | 保单号 | P03343342 | |||
ROLE_TYPE | STRING | 客户角色(0:投保人;1:被保人) | P03434358 | 10101001900015827334 | 0 |
P03234358 | 1010001900019919669 | 0 |
三、表单信息表:DWD_INSURE_POLICY
- 表结构
字段英文 | 类型 | 字段中文名 |
---|---|---|
POLICY_NO | STRING | 保单号 |
INSURE_BEGIN_DATE | TIMESTAMP | 保险起期 |
INSURE_END_DATE | TIMESTAMP | 保险止期 |
ACTUAL_PREMIUM | DECIMAL(32,2) | 保费(元) |
- 表数据采样
POLICY_NO | INSURE_BEGIN_DATE | INSURE_END_DATE | ACTUAL_PREMIUN |
---|---|---|---|
10101001900011775542 | 2018-12-18 00:00:00 | 2019-12-17 23:59:59 | 5067.00 |
10101001900015827334 | 2019-01-07 00:00:00 | 2020-01-06 23:59:59 | 2486.00 |
10101001900019919669 | 2012-06-25 00:00:00 | 2013-06-24 23:59:59 | 10245.00 |
小微公司的定义为:注册资本小于等于4000万元,企业类型不为国企和事业单位。
请使用HIVE SQL完成以下问题:
问题1:
假设,当前时间与公司注册时间的差值(单位为年),为该公司的经营时长;
假如:锡山区安镇尚捞火锅店的经营时长为:2019-2018=1(年)
请使用HIVE SQL,计算小微公司的平均经营时长
select '小微企业' as name,avg(2019-year(regist_date)) from dwd_customer_base where nvl(raw_regist_capi,0)<=4000 and organization_type not in ('国有企业','事业单位');
问题2:
一个客户有多个保单,客户与保单的关联关系保存到DWD_CUSTOMER_REL表中。
请写HIVE SQL,计算小微公司且角色为投保人,保险起期在18年的总保费;
select round(sum(d.actual_premium),6) as 总保费
from(
select a.*,b.rolicy_no
from(
select *
from dwd_customer_base
where raw_regist_capi=4000
and organization_type not in ('国有企业','事业单位')
) a join (
select *
from dwd_customer_rel
where role_type='0'
) b
on a.client_no=b.client_no
) c
join (
select *
from dwd_insure_policy
where year(insure_begin_date)='2018'
) d
on c.rolicy_no=d.rolicy_no
;
问题3:
假设,DWD_CUSTOMER_REL客户关联关系表中,存在部分客户保单数很多,部分客户保单数很少的情况,此时DWD_CUSTOMER_BASE表关联,程序在运行时会出现什么问题?
那么,基于问题2计算18年总保费时,代码需要如何调整才能避免这个问题?
会有数据倾斜的问题产生。解决办法:把DWD_CUSTOMER_REL客户关联关系表放入内存(mapjoin)
问题4:
假设,判断一个客户是否在保的条件是:该客户只要存在一个保单,这个保单的保险止期时间大于当前,则该客户就属于在保客户;
请写HIVE SQL,计算小微公司的在保客户数
select count(distinct a.client_name) as 客户数
from(
select a.*,
b.rolicy_no
from(
select *
from dwd_customer_base
where nvl(raw_regist_capi,0)<=4000
and organization_type not in ('国有企业','事业单位')
) a
join (
select client_no,count(*)
from dwd_customer_rel
group by client_no
having count(*) = 1
) b
on a.client_no=b.client_no
) c
join (
select *
from dwd_insure_policy
where regexp_replace(insure_end_date,'-','')>from_unixtime(unix_timestamp(),'yyyyMMdd')
) d
on c.rolicy_no=d.rolicy_no
问题5:
假设有一张全国省、市、县的维度,表名:DIM_CITY_DEFINE
PROVINCE(省) | CITY(市) | COUNTY(县/区) |
---|---|---|
江苏省 | 无锡市 | 锡山区 |
江苏省 | 无锡市 | 新吴区 |
NULL | 北京市 | 西城区 |
NULL | 北京市 | 东城区 |
注:
1)全国的所有的省/市名称没有重复,县/区有重复;
2)业务主键为:省、市、县
请写HIVE SQL,根据DWD_CUSTOMER_BASE表中的注册地址(COMPANY_ADDRED\),清洗出公司所在的省(PROVINCE)、市(CITY)、县/区(COUNTY)三个字段
select cb.*,cd.pro, cd2.city , cd3.county
from dwd_customer_base cb
left join
(select province as pro from dim_city_define group by province) cd on INSTR(cb.company_addres,cd.pro)>0
left join
(select city as city from dim_city_define group by city) cd2 on INSTR(cb.company_addres,cd2.city)>0
left join
(select city,county as county from dim_city_define group by city,county) cd3 on INSTR(cb.company_addres,cd3.city)>0 and INSTR(cb.company_addres,cd3.county)>0