Hive面试题5

业务场景说明:假设客户在我司系统中存在唯一的标示为客户号(CLIENT_NO),客户在向我司投保时,会产生一笔保单,这笔保单的唯一标示为保单号(POLICY_NO),保单信息中包括了保险开始时间(INSURE_BEGIN_DATE)与结束时间(INSURE_END_DATE),以及需要支付的保费(ACTUAL_PREMIUM)。以下是改流程主要涉及到的三张表。请了解表结构以及数据情况并作答:

一、客户信息标表:DWD_CUSTOMER_BASE

  1. 表结构
字段英文 类型 字段中文名
CLIENT_NO STRING 客户名
CLIENT_NAME STRING 客户名称
ORGANIZATION_TYPE STRING 企业类型
RAW_REGIST_CAPI BIFINT 注册资本(万元)
REGIST_DATE TIMESTAMP 注册时间
COMPANY_ADDRES STRING 注册地址
  1. 表数据采集
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

  1. 表结构 表数据采样
字段英文 类型 字段中文名 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

  1. 表结构
字段英文 类型 字段中文名
POLICY_NO STRING 保单号
INSURE_BEGIN_DATE TIMESTAMP 保险起期
INSURE_END_DATE TIMESTAMP 保险止期
ACTUAL_PREMIUM DECIMAL(32,2) 保费(元)
  1. 表数据采样
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
发布了35 篇原创文章 · 获赞 12 · 访问量 6614

猜你喜欢

转载自blog.csdn.net/u012955829/article/details/105315882