oneid与用户标签之间的相互打通 实现用户标签

附录说明:

打个标签盯住他
打个标签盯住雷碧
实现完整的用户标签需要以完整的oneid生成且oneid定时更新新增用户 才可以实现

整个流程:

    所用组件 hive-》es(与hive产生映射的表)
    数据处理流程  

1、使用数据源数据进行数据清理(整理出关联数据与将要打标的数据值)

ods_tds_ddc_sqoop.crmc01c样例数据
在这里插入图片描述

2、将关联键值与oneid对应关联起来 并整理好将要打标值的外部关联格式化

oneid_data.oneid_data_sink_id_mapping数据样式在这里插入图片描述
lable.lable_new_dict标签字典样例数据
在这里插入图片描述

3、数据打标形成格式

							(oneid    label1)
                             (oneid    label2)
                             (oneid    label3)
        的格式也可以(oneid   label1,label2,label3)均可
  • 1
  • 2
  • 3
  • 4

–数据插入中间表 处理出每条数据的唯一ID和对应ID身份 以及每个打标职位

insert into lable.dws_oneid_hq_app_lable
select
   null AS user_name
   ,user_id
   ,null AS user_mobile
   ,null AS user_birthday
   ,null AS user_registime
   ,null AS user_lastlogintime
   ,null AS user_address
   ,label_code
   ,uni
   ,label_name
   ,id_mapping
from
   (--关联键值用作与字典表对接使用
   select
       user_id
       ,uni
       ,id_mapping
   from
       (--选出每个id对应的最大数值用于去重
       select
               user_id
               ,CONCAT_WS('&&',max(vsex),max(VMARRIGE)) AS valu
               ,id_mapping
       from
       (
           --数据格式化处理 与对接外部值关联选择
           select 
               case 
                   when  length(VMOBILE)=11 then VMOBILE
                   when  length(VLKMOBILE)=11 then VLKMOBILE
                   when  length(VCERTIFICATENO) is not null then VCERTIFICATENO
                   else null end ss
               ,case
                   when  vsex="0" then "男"
                   when  vsex="1" then "女"
                   else "性别_其他" end vsex
               ,CASE 
                   WHEN VMARRIGE ='01' or VMARRIGE ='已婚' THEN '已婚'
                   WHEN VMARRIGE ='02' or VMARRIGE ='未婚' THEN '未婚'
                   ELSE '婚姻_其他' END VMARRIGE
           from 
               ods_tds_ddc_sqoop.crmc01c
       )sou
       left join 
       ( --使用行转列的方式 将oneid转换成对应多行
           select
               user_id
               ,id_mapping
               ,split(unio,'#&')[1] AS con
           from 
               oneid_data.oneid_data_sink_id_mapping lateral view explode(split(id_mapping, ','))tt  as unio 
           where 
               dt='${dt}' 
           ) oneid
       on sou.ss=oneid.con 
       where sou.ss is not null 
               and oneid.user_id is not null
       group by user_id,id_mapping
       ) tt  lateral view explode(split(valu, '&&'))tt  as uni
   ) etl 
left join 
   (select label_name_data,label_code,label_name from lable.lable_new_dict where label_name_data is not null )
   dict 
on etl.uni=dict.label_name_data; 

4、数据输入中间表 目的是汇总多个源产生的数据标签方便下一步汇总使用

HIVE建表语句:
dws_oneid_hq_app_lable(中间层建表)
   CREATE  TABLE `lable.dws_oneid_hq_app_lable`(
   user_name  String COMMENT '用户名称',
   user_id  String COMMENT '用户id',
   user_mobile  String COMMENT '用户手机号',
   user_birthday  String COMMENT '用户生日',
   user_registime  String COMMENT '用户注册时间',
   user_lastlogintime  String COMMENT '用户最后登录时间',
   user_address  String COMMENT '用户地址',
   lable String COMMENT '标签',
   label_name String COMMENT '标签名称',
   label_name_data String COMMENT '数据标签名称',
   id_mapping  String COMMENT '用户身份集合'
   )
   COMMENT 'oneid打通标签数据汇总第一步中间表';

5、创建hive最终结果表

--结果表对应 es的表创建
tdm_oneid_hq_app_lable(对应es表标签汇总表)
add jar hdfs:///user/es_hadoop/elasticsearch-hadoop-7.3.2.jar;
	CREATE EXTERNAL TABLE `lable.tdm_oneid_hq_app_lable`(
	user_name  String COMMENT '用户名称',
	user_id  String COMMENT '用户id',
	user_mobile  String COMMENT '用户手机号',
	user_birthday  String COMMENT '用户生日',
	user_registime  String COMMENT '用户注册时间',
	user_lastlogintime  String COMMENT '用户最后登录时间',
	user_address  String COMMENT '用户地址',
	lable String COMMENT '标签',
    id_mapping  String COMMENT '用户身份集合'
	)
	COMMENT '标签数据汇总'
	STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
	TBLPROPERTIES (
	'es.resource' = 'tdm_oneid_hq_app_lable', 
	'es.nodes'='prod.dbaas.private',
	'es.port'='19204',
	'es.mapping.id' = 'user_id',
	'es.write.operation'='upsert',
	'es.mapping.names'='user_name:user_name,user_id:user_id,user_mobile:user_mobile
        ,user_birthday:user_birthday,user_registime:user_registime,user_lastlogintime:user_lastlogintime
        ,user_address:user_address,lable:lable,id_mapping:id_mapping'
	)

6、对应创建es表建立映射关系

部分因为业务需求需要创建成分词形式以便于后期查询使用

ES建表语句
PUT tdm_oneid_hq_app_lable/?include_type_name=true
	{
	  "mappings":{
		"_doc":{
		  "properties":{
			"user_name":{
				"type":"keyword"
			  },
			"user_id":{
				"type":"keyword"
			  },
			"user_mobile":{
				"type":"keyword"
			  },
			"user_birthday":{
				"type":"keyword"
			  },
		    "user_registime":{
			   "type":"keyword"
			  },
			  "user_lastlogintime":{
			   "type":"keyword"
			  },
			"user_address":{
			   "type":"keyword"
			  },
			 "lable":{
				"type":"text",
				"analyzer": "standard"
			  },
			 "id_mapping":{
				"type":"text",
				"analyzer": "standard"
			  }
		  }
		}
	  }
	}

7、从中间表读取数据进行汇总

add jar hdfs:///user/es_hadoop/elasticsearch-hadoop-7.3.2.jar;
add jar hdfs:///user/es_hadoop/httpclient-4.5.5.jar;
add jar hdfs:///user/es_hadoop/org.apache.commons.httpclient.jar;
insert into lable.tdm_oneid_hq_app_lable
select
    max(user_name) -- '用户名称',
	,max(user_id) -- '用户id',
	,max(user_mobile) -- '用户手机号',
	,max(user_birthday) -- '用户生日',
	,max(user_registime) -- '用户注册时间',
	,max(user_lastlogintime) -- '用户最后登录时间',
	,max(user_address) -- '用户地址',
	,CONCAT_WS(',',collect_set(lable))
    ,id_mapping  -- '用户身份集合'
from  lable.dws_oneid_hq_app_lable 
group by 
	user_id  -- '用户id',
    ,id_mapping  -- '用户身份集合'

8、数据结果输入到建立映射的hive表中在es中查询

GET tdm_oneid_hq_app_lable/_search
  • 1

在这里插入图片描述

辛苦码字如有转载请标明出处谢谢!——拜耳法

都看到这里了非常感谢!
本片章暂未完结 有疑问请+vx :baierfa
在这里插入图片描述

原文地址:https://www.cnblogs.com/baierfa/p/13458759.html