Commit 67701600 authored by 刘喆's avatar 刘喆

create table ml_c_et_pe_preciseexposuredetail_dimen_d_rt

parent f4fde7b3
package com.gmei.bean.ml;
import java.util.Date;
/**
* ClassName: MlPreciseExposureDetailBean
* TableName: ML_C_ET_PE_PRECISEEXPOSUREDETAIL_DIMEN_D_RT
* Function:
* Reason: ML层精准曝光明细BEAN类
* Date: 2020/04/22 下午5:07
*
* @author liuzhe
* @since JDK 1.8
*/
/*
get_json_object(result_card,"$.card_id") as card_id, --卡片id
get_json_object(result_card,"$.card_content_type") as card_content_type, --卡片内容类型
get_json_object(result_card,"$.card_type") as card_type, --卡片类型
get_json_object(result_card,"$.transaction_type") as transaction_type, --卡片业务类型
get_json_object(result_card,"$.absolute_position") as absolute_position, --绝对位置
get_json_object(result_card,"$.relative_position") as relative_position, --相对位置
get_json_object(result_card,"$.filter_f") as filter_f,
get_json_object(result_card,"$.is_cpc") as is_cpc, --是否为cpc收费卡片
get_json_object(result_card,"$.cpc_referer") as cpc_referer, --cpc_referer
get_json_object(result_card,"$.in_page_pose ") as in_page_pose,
get_json_object(result_card,"$.result_status") as result_status, --结果状态
get_json_object(result_card,"$.sec_tab_name") as sec_tab_name, --二级页面名称
--非正常卡片通用参数(banner 豆腐块 icon)
get_json_object(result_card,"$.module_id") as module_id, --模块id
get_json_object(result_card,"$.card_name ") as card_name, --卡片名字
get_json_object(result_card,"$.url") as url, --跳转链接
--豆腐块额外参数
get_json_object(result_card,"$.module_type") as module_type, --模块类型
get_json_object(result_card,"$.grid") as grid, --区域 (a、b、c、d,目前线上最多四张图片)
--icon的额外参数
get_json_object(result_card,"$.total_position") as total_position,--总共有几屏
get_json_object(result_card,"$.current_position") as current_position --icon在第几屏
*/
public class MlPreciseExposureDetailBean {
private Date day_id;
// private String gm_nginx_timestamp;
// private String create_timestamp;
private String user_id;
private String action;
// private String action_name; //匹配码表DIM_ACTION_TYPE(只有两种不需要关联)
private String page_code;
private String page_name; //匹配码表DIM_PAGE_TYPE
private String tab_name;
private String business_id;
private String referrer_code;
private String referrer_name; //匹配码表DIM_PAGE_TYPE
private String referrer_id;
private String card_id;
private String card_name;
private String card_content_type;
private String card_content_type_name; //匹配码表DIM_CARD_CONTENT_TYPE
private String card_type;
private String card_type_name; //匹配码表DIM_CARD_TYPE
private String is_cpc;
private String cpc_referer;
// private String absolute_position;
// private String relative_position;
private String transaction_type;
private String transaction_type_name; //匹配码表DIM_TRANSACTION_TYPE
private String filter;
private String query;
// private String app_grey_type;
// private String app_channel;
private String app_version;
private String current_city_id;
private String current_city_name; //匹配码表DIM_CITY
private String current_province_id; //匹配码表DIM_CITY
private String current_province_name; //匹配码表DIM_CITY
private String current_country_id; //匹配码表DIM_CITY
private String current_country_name; //匹配码表DIM_CITY
private String current_region_id; //匹配码表DIM_CITY
private String current_region_name; //匹配码表DIM_CITY
private String app_code;
private String device_os_type;
// private String device_model;
private String device_id;
// private String device_android_id;
// private String device_idfv;
private String create_time_date;
private String create_time_day;
private String gm_nginx_time_date;
private String gm_nginx_time_day;
private Integer preciseexposure_num;
public MlPreciseExposureDetailBean() {
}
public MlPreciseExposureDetailBean(Date day_id, String user_id, String action, String page_code, String page_name, String tab_name, String business_id, String referrer_code, String referrer_name, String referrer_id, String card_id, String card_name, String card_content_type, String card_content_type_name, String card_type, String card_type_name, String is_cpc, String cpc_referer, String transaction_type, String transaction_type_name, String filter, String query, String app_version, String current_city_id, String current_city_name, String current_province_id, String current_province_name, String current_country_id, String current_country_name, String current_region_id, String current_region_name, String app_code, String device_os_type, String device_id, String create_time_date, String create_time_day, String gm_nginx_time_date, String gm_nginx_time_day, Integer preciseexposure_num) {
this.day_id = day_id;
this.user_id = user_id;
this.action = action;
// this.action_name = action_name;
this.page_code = page_code;
this.page_name = page_name;
this.tab_name = tab_name;
this.business_id = business_id;
this.referrer_code = referrer_code;
this.referrer_name = referrer_name;
this.referrer_id = referrer_id;
this.card_id = card_id;
this.card_name = card_name;
this.card_content_type = card_content_type;
this.card_content_type_name = card_content_type_name;
this.card_type = card_type;
this.card_type_name = card_type_name;
this.is_cpc = is_cpc;
this.cpc_referer = cpc_referer;
this.transaction_type = transaction_type;
this.transaction_type_name = transaction_type_name;
this.filter = filter;
this.query = query;
// this.app_channel = app_channel;
this.app_version = app_version;
this.current_city_id = current_city_id;
this.current_city_name = current_city_name;
this.current_province_id = current_province_id;
this.current_province_name = current_province_name;
this.current_country_id = current_country_id;
this.current_country_name = current_country_name;
this.current_region_id = current_region_id;
this.current_region_name = current_region_name;
this.app_code = app_code;
this.device_os_type = device_os_type;
this.device_id = device_id;
this.create_time_date = create_time_date;
this.create_time_day = create_time_day;
this.gm_nginx_time_date = gm_nginx_time_date;
this.gm_nginx_time_day = gm_nginx_time_day;
this.preciseexposure_num = preciseexposure_num;
}
public Date getDay_id() {
return day_id;
}
public void setDay_id(Date day_id) {
this.day_id = day_id;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
// public String getAction_name() {
// return action_name;
// }
// public void setAction_name(String action_name) {
// this.action_name = action_name;
// }
public String getPage_code() {
return page_code;
}
public void setPage_code(String page_code) {
this.page_code = page_code;
}
public String getPage_name() {
return page_name;
}
public void setPage_name(String page_name) {
this.page_name = page_name;
}
public String getTab_name() {
return tab_name;
}
public void setTab_name(String tab_name) {
this.tab_name = tab_name;
}
public String getBusiness_id() {
return business_id;
}
public void setBusiness_id(String business_id) {
this.business_id = business_id;
}
public String getReferrer_code() {
return referrer_code;
}
public void setReferrer_code(String referrer_code) {
this.referrer_code = referrer_code;
}
public String getReferrer_name() {
return referrer_name;
}
public void setReferrer_name(String referrer_name) {
this.referrer_name = referrer_name;
}
public String getReferrer_id() {
return referrer_id;
}
public void setReferrer_id(String referrer_id) {
this.referrer_id = referrer_id;
}
public String getCard_id() {
return card_id;
}
public void setCard_id(String card_id) {
this.card_id = card_id;
}
public String getCard_name() {
return card_name;
}
public void setCard_name(String card_name) {
this.card_name = card_name;
}
public String getCard_content_type() {
return card_content_type;
}
public void setCard_content_type(String card_content_type) {
this.card_content_type = card_content_type;
}
public String getCard_content_type_name() {
return card_content_type_name;
}
public void setCard_content_type_name(String card_content_type_name) {
this.card_content_type_name = card_content_type_name;
}
public String getCard_type() {
return card_type;
}
public void setCard_type(String card_type) {
this.card_type = card_type;
}
public String getCard_type_name() {
return card_type_name;
}
public void setCard_type_name(String card_type_name) {
this.card_type_name = card_type_name;
}
public String getIs_cpc() {
return is_cpc;
}
public void setIs_cpc(String is_cpc) {
this.is_cpc = is_cpc;
}
public String getCpc_referer() {
return cpc_referer;
}
public void setCpc_referer(String cpc_referer) {
this.cpc_referer = cpc_referer;
}
// public String getAbsolute_position() {
// return absolute_position;
// }
//
// public void setAbsolute_position(String absolute_position) {
// this.absolute_position = absolute_position;
// }
//
// public String getRelative_position() {
// return relative_position;
// }
//
// public void setRelative_position(String relative_position) {
// this.relative_position = relative_position;
// }
public String getTransaction_type() {
return transaction_type;
}
public void setTransaction_type(String transaction_type) {
this.transaction_type = transaction_type;
}
public String getTransaction_type_name() {
return transaction_type_name;
}
public void setTransaction_type_name(String transaction_type_name) {
this.transaction_type_name = transaction_type_name;
}
public String getFilter() {
return filter;
}
public void setFilter(String filter) {
this.filter = filter;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
// public String getApp_channel() {
// return app_channel;
// }
// public void setApp_channel(String app_channel) {
// this.app_channel = app_channel;
// }
public String getApp_version() {
return app_version;
}
public void setApp_version(String app_version) {
this.app_version = app_version;
}
public String getCurrent_city_id() {
return current_city_id;
}
public void setCurrent_city_id(String current_city_id) {
this.current_city_id = current_city_id;
}
public String getCurrent_city_name() {
return current_city_name;
}
public void setCurrent_city_name(String current_city_name) {
this.current_city_name = current_city_name;
}
public String getCurrent_province_id() {
return current_province_id;
}
public void setCurrent_province_id(String current_province_id) {
this.current_province_id = current_province_id;
}
public String getCurrent_province_name() {
return current_province_name;
}
public void setCurrent_province_name(String current_province_name) {
this.current_province_name = current_province_name;
}
public String getCurrent_country_id() {
return current_country_id;
}
public void setCurrent_country_id(String current_country_id) {
this.current_country_id = current_country_id;
}
public String getCurrent_country_name() {
return current_country_name;
}
public void setCurrent_country_name(String current_country_name) {
this.current_country_name = current_country_name;
}
public String getCurrent_region_id() {
return current_region_id;
}
public void setCurrent_region_id(String current_region_id) {
this.current_region_id = current_region_id;
}
public String getCurrent_region_name() {
return current_region_name;
}
public void setCurrent_region_name(String current_region_name) {
this.current_region_name = current_region_name;
}
public String getApp_code() {
return app_code;
}
public void setApp_code(String app_code) {
this.app_code = app_code;
}
public String getDevice_os_type() {
return device_os_type;
}
public void setDevice_os_type(String device_os_type) {
this.device_os_type = device_os_type;
}
public String getDevice_id() {
return device_id;
}
public void setDevice_id(String device_id) {
this.device_id = device_id;
}
public String getCreate_time_date() {
return create_time_date;
}
public void setCreate_time_date(String create_time_date) {
this.create_time_date = create_time_date;
}
public String getCreate_time_day() {
return create_time_day;
}
public void setCreate_time_day(String create_time_day) {
this.create_time_day = create_time_day;
}
public String getGm_nginx_time_date() {
return gm_nginx_time_date;
}
public void setGm_nginx_time_date(String gm_nginx_time_date) {
this.gm_nginx_time_date = gm_nginx_time_date;
}
public String getGm_nginx_time_day() {
return gm_nginx_time_day;
}
public void setGm_nginx_time_day(String gm_nginx_time_day) {
this.gm_nginx_time_day = gm_nginx_time_day;
}
public Integer getPreciseexposure_num() {
return preciseexposure_num;
}
public void setPreciseexposure_num(Integer preciseexposure_num) {
this.preciseexposure_num = preciseexposure_num;
}
@Override
public String toString() {
return "MlPreciseExposureBean{" +
"day_id='" + day_id + '\'' +
", user_id='" + user_id + '\'' +
", action='" + action + '\'' +
", page_code='" + page_code + '\'' +
", page_name='" + page_name + '\'' +
", tab_name='" + tab_name + '\'' +
", business_id='" + business_id + '\'' +
", referrer_code='" + referrer_code + '\'' +
", referrer_name='" + referrer_name + '\'' +
", referrer_id='" + referrer_id + '\'' +
", card_id='" + card_id + '\'' +
", card_name='" + card_name + '\'' +
", card_content_type='" + card_content_type + '\'' +
", card_content_type_name='" + card_content_type_name + '\'' +
", card_type='" + card_type + '\'' +
", card_type_name='" + card_type_name + '\'' +
", is_cpc='" + is_cpc + '\'' +
", cpc_referer='" + cpc_referer + '\'' +
", transaction_type='" + transaction_type + '\'' +
", transaction_type_name='" + transaction_type_name + '\'' +
", filter='" + filter + '\'' +
", query='" + query + '\'' +
", app_version='" + app_version + '\'' +
", current_city_id='" + current_city_id + '\'' +
", current_city_name='" + current_city_name + '\'' +
", current_province_id='" + current_province_id + '\'' +
", current_province_name='" + current_province_name + '\'' +
", current_country_id='" + current_country_id + '\'' +
", current_country_name='" + current_country_name + '\'' +
", current_region_id='" + current_region_id + '\'' +
", current_region_name='" + current_region_name + '\'' +
", app_code='" + app_code + '\'' +
", device_os_type='" + device_os_type + '\'' +
", device_id='" + device_id + '\'' +
", create_time_date='" + create_time_date + '\'' +
", create_time_day='" + create_time_day + '\'' +
", gm_nginx_time_date='" + gm_nginx_time_date + '\'' +
", gm_nginx_time_day='" + gm_nginx_time_day + '\'' +
", preciseexposure_num=" + preciseexposure_num +
'}';
}
}
package com.gmei.cache;
import com.gmei.bean.ml.MlPreciseExposureBean;
import com.gmei.bean.ml.MlPreciseExposureDetailBean;
import com.gmei.jdbc.MysqlJdbcMl;
import java.util.ArrayList;
import java.util.List;
/**
* ClassName: MlPreciseExposureDetailDao
* Function:
* Reason: ml_c_et_pe_preciseexposuredetail_dimen_d_rt数据下发操作类
* Date: 2020/04/22 上午11:35
*
* @author liuzhe
* @since JDK 1.8
*/
public class MlPreciseExposureDetailDao {
private MysqlJdbcMl mysqlJdbcMl;
private String sql;
private String sinkJdbcUrl;
private String sinkTableName;
public MlPreciseExposureDetailDao(String sinkJdbcUrl, String sinkTableName) {
this.sinkJdbcUrl = sinkJdbcUrl;
this.sinkTableName = sinkTableName;
this.mysqlJdbcMl = MysqlJdbcMl.getInstance(sinkJdbcUrl);
}
/**
* Function: insertMlPreciseExposure
* Reason: 批量向表中插入数据
* Date: 2020/04/22 下午5:38
*
* @author liuzhe
* @since JDK 1.8
*/
public void insertMlPreciseExposureBatch(ArrayList<MlPreciseExposureDetailBean> mlPreciseExposureDetailBeanList) throws Exception {
List<List<Object>> mlPreciseExposureDetailBeanParams = new ArrayList();
for (MlPreciseExposureDetailBean mlPreciseExposureDetailBean : mlPreciseExposureDetailBeanList) {
sql = "insert into " + sinkTableName + "\n" +
" (day_id,\n" +
" action,\n" +
" app_code,\n" +
" page_code,\n" +
" page_name,\n" +
" tab_name,\n" +
" business_id,\n" +
" referrer_code,\n" +
" referrer_name,\n" +
" referrer_id,\n" +
" card_id,\n" +
" card_name,\n" +
" card_content_type,\n" +
" card_content_type_name,\n" +
" card_type,\n" +
" card_type_name,\n" +
" is_cpc,\n" +
" cpc_referer,\n" +
" transaction_type,\n" +
" transaction_type_name,\n" +
" filter,\n" +
" query,\n" +
" app_version,\n" +
" user_id,\n" +
" device_id,\n" +
" device_os_type,\n" +
" current_city_id,\n" +
" current_city_name,\n" +
" current_province_id,\n" +
" current_province_name,\n" +
" current_country_id,\n" +
" current_country_name,\n" +
" current_region_id,\n" +
" current_region_name,\n" +
" create_time_date,\n" +
" create_time_day,\n" +
" gm_nginx_time_date,\n" +
" gm_nginx_time_day,\n" +
" preciseexposure_num)\n" +
"values\n" +
" (?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?,\n" +
" ?)";
List<Object> params = new ArrayList<Object>();
params.add(mlPreciseExposureDetailBean.getGm_nginx_time_day());
params.add(mlPreciseExposureDetailBean.getAction());
params.add(mlPreciseExposureDetailBean.getApp_code());
params.add(mlPreciseExposureDetailBean.getPage_code());
params.add(mlPreciseExposureDetailBean.getPage_name());
params.add(mlPreciseExposureDetailBean.getTab_name());
params.add(mlPreciseExposureDetailBean.getBusiness_id());
params.add(mlPreciseExposureDetailBean.getReferrer_code());
params.add(mlPreciseExposureDetailBean.getReferrer_name());
params.add(mlPreciseExposureDetailBean.getReferrer_id());
params.add(mlPreciseExposureDetailBean.getCard_id());
params.add(mlPreciseExposureDetailBean.getCard_name());
params.add(mlPreciseExposureDetailBean.getCard_content_type());
params.add(mlPreciseExposureDetailBean.getCard_content_type_name());
params.add(mlPreciseExposureDetailBean.getCard_type());
params.add(mlPreciseExposureDetailBean.getCard_type_name());
params.add(mlPreciseExposureDetailBean.getIs_cpc());
params.add(mlPreciseExposureDetailBean.getCpc_referer());
params.add(mlPreciseExposureDetailBean.getTransaction_type());
params.add(mlPreciseExposureDetailBean.getTransaction_type_name());
params.add(mlPreciseExposureDetailBean.getFilter());
params.add(mlPreciseExposureDetailBean.getQuery());
params.add(mlPreciseExposureDetailBean.getApp_version());
params.add(mlPreciseExposureDetailBean.getUser_id());
params.add(mlPreciseExposureDetailBean.getDevice_id());
params.add(mlPreciseExposureDetailBean.getDevice_os_type());
params.add(mlPreciseExposureDetailBean.getCurrent_city_id());
params.add(mlPreciseExposureDetailBean.getCurrent_city_name());
params.add(mlPreciseExposureDetailBean.getCurrent_province_id());
params.add(mlPreciseExposureDetailBean.getCurrent_province_name());
params.add(mlPreciseExposureDetailBean.getCurrent_country_id());
params.add(mlPreciseExposureDetailBean.getCurrent_country_name());
params.add(mlPreciseExposureDetailBean.getCurrent_region_id());
params.add(mlPreciseExposureDetailBean.getCurrent_region_name());
params.add(mlPreciseExposureDetailBean.getCreate_time_date());
params.add(mlPreciseExposureDetailBean.getCreate_time_day());
params.add(mlPreciseExposureDetailBean.getGm_nginx_time_date());
params.add(mlPreciseExposureDetailBean.getGm_nginx_time_day());
params.add(mlPreciseExposureDetailBean.getPreciseexposure_num());
mlPreciseExposureDetailBeanParams.add(params);
}
// System.out.println(params.toString());
mysqlJdbcMl.updateBatch(sql, mlPreciseExposureDetailBeanParams);
}
}
package com.gmei.function;
import com.gmei.bean.bl.BlPreciseExposureBean;
import com.gmei.bean.bl.BlPreciseExposureParamsExposureCardsBean;
import com.gmei.bean.ml.MlPreciseExposureDetailBean;
import com.gmei.utils.BeanReflectUtil;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.util.Collector;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* ClassName: MlpreciseExposureDetailFlatMapFunction
* Function:
* Reason: ML层明细数据清洗转换器(一对多)
* Date: 2020/04/22 上午11:01
*
* @author liuzhe
* @since JDK 1.8
*/
public class MlpreciseExposureDetailFlatMapFunction implements FlatMapFunction<BlPreciseExposureBean, MlPreciseExposureDetailBean> {
@Override
public void flatMap(BlPreciseExposureBean blPreciseExposureBean, Collector<MlPreciseExposureDetailBean> collector) throws Exception {
ArrayList<MlPreciseExposureDetailBean> mlPreciseExposureDetailBeanList = flatmapBlPreciseExposure(blPreciseExposureBean);
// System.out.println("MlpreciseExposureFlatMapFunction" + blPreciseExposureBean);
for (MlPreciseExposureDetailBean mlPreciseExposureDetailBean : mlPreciseExposureDetailBeanList) {
collector.collect(mlPreciseExposureDetailBean);
}
}
/**
* Function: flatmapBlPreciseExposure
* Reason: 数据爆炸(LATERAL VIEW EXPLODE)
* Date: 2019/12/25 下午5:14
*
* @author liuzhe
* @since JDK 1.8
*/
public ArrayList<MlPreciseExposureDetailBean> flatmapBlPreciseExposure(BlPreciseExposureBean blPreciseExposureBean) throws Exception {
ArrayList<BlPreciseExposureParamsExposureCardsBean> exposure_cards = blPreciseExposureBean.getExposure_cards();
String app_version = blPreciseExposureBean.getApp_version();
String device_os_type = blPreciseExposureBean.getDevice_os_type();
ArrayList<MlPreciseExposureDetailBean> mlPreciseExposureDetailBeanDetailList = new ArrayList<>();
for(BlPreciseExposureParamsExposureCardsBean exposureCardsBean: exposure_cards) {
String card_id = exposureCardsBean.getCard_id();
String card_content_type = exposureCardsBean.getCard_content_type();
String card_type = exposureCardsBean.getCard_type();
String card_name = exposureCardsBean.getCard_name();
String target_name = exposureCardsBean.getTarget_name();
String is_cpc = exposureCardsBean.getIs_cpc();
String cpc_referer = exposureCardsBean.getCpc_referer();
String absolute_position = exposureCardsBean.getAbsolute_position();
String relative_position = exposureCardsBean.getRelative_position();
String transaction_type = exposureCardsBean.getTransaction_type();
//1.3 绝对位置和相对位置位置错误
//问题描述:在'7.7.35','7.7.36' android的绝对位置和相对位置写反
if("android".equals(device_os_type) && ("7.7.35".equals(app_version) || "7.7.36".equals(app_version))) {
String change = absolute_position;
absolute_position = relative_position;
relative_position = change;
}
//1.10 banner、豆腐块、icon、搜索词和功能区入口的card_type参数问题
//问题描述:当卡片类型为豆腐块、icon、banner、搜索词和功能区入口的时候的时候正确的card_type的参数值被赋给了card_content_type(banner、icon、gadget、search_query、function_entrance)
List<String> card_content_type_list = Arrays.asList("banner","icon","gadget","search_query","function_entrance");
if (card_content_type_list.contains(card_content_type)) {
card_type = card_content_type;
card_content_type = null;
}
if ("search_query".equals(card_type)) {
card_type = "search_word";
}
//1.14 百科卡片曝光新增参数wiki_type
//问题:从7.19.0版本开始,百科卡片曝光,新增了wiki_type参数
//1.12 card_content_type的qa值应该被换成q_a
if ("qa".equals(card_content_type)) {
card_content_type = card_content_type.replace("qa","q_a");
}
//card_type为card的标准码值为common_card,数据中为card
if("card".equals(card_type)) {
card_type = "common_card";
}
//card_type为banner的标准码值为common_banner,数据中为banner
if("banner".equals(card_type)) {
card_type = "common_banner";
}
//card_type为video的标准码值为video_card,数据中为video
if("video".equals(card_type)) {
card_type = "video_card";
}
//1.16 初期的搜索词曝光业务类型运营有promote,operating字段,需要修正为operation
if("promote".equals(transaction_type) || "operating".equals(transaction_type)) {
transaction_type = "operation";
}
MlPreciseExposureDetailBean mlPreciseExposureDetailBean = new MlPreciseExposureDetailBean();
mlPreciseExposureDetailBean.setDay_id(blPreciseExposureBean.getDay_id());
mlPreciseExposureDetailBean.setUser_id(blPreciseExposureBean.getUser_id());
mlPreciseExposureDetailBean.setAction(blPreciseExposureBean.getAction());
mlPreciseExposureDetailBean.setPage_code(blPreciseExposureBean.getPage_code());
mlPreciseExposureDetailBean.setTab_name(blPreciseExposureBean.getTab_name());
mlPreciseExposureDetailBean.setBusiness_id(blPreciseExposureBean.getBusiness_id());
mlPreciseExposureDetailBean.setReferrer_code(blPreciseExposureBean.getReferrer_code());
mlPreciseExposureDetailBean.setReferrer_id(blPreciseExposureBean.getReferrer_id());
mlPreciseExposureDetailBean.setCard_id(card_id);
mlPreciseExposureDetailBean.setCard_content_type(card_content_type);
//1.13 target_name与card_name的参数的统一
//问题描述:将target_name参数的值赋给card_name
mlPreciseExposureDetailBean.setCard_name(card_name == null ? target_name : card_name);
mlPreciseExposureDetailBean.setCard_type(card_type);
mlPreciseExposureDetailBean.setIs_cpc(is_cpc);
mlPreciseExposureDetailBean.setCpc_referer(cpc_referer);
// mlPreciseExposureDetailBean.setAbsolute_position(absolute_position);
// mlPreciseExposureDetailBean.setRelative_position(relative_position);
mlPreciseExposureDetailBean.setTransaction_type(transaction_type);
mlPreciseExposureDetailBean.setFilter(blPreciseExposureBean.getFilter());
mlPreciseExposureDetailBean.setQuery(blPreciseExposureBean.getQuery());
// mlPreciseExposureDetailBean.setChannel_id(blPreciseExposureBean.getApp_channel());
mlPreciseExposureDetailBean.setApp_version(blPreciseExposureBean.getApp_version());
mlPreciseExposureDetailBean.setCurrent_city_id(blPreciseExposureBean.getApp_current_city_id());
mlPreciseExposureDetailBean.setApp_code(blPreciseExposureBean.getApp_code());
mlPreciseExposureDetailBean.setDevice_os_type(blPreciseExposureBean.getDevice_os_type());
mlPreciseExposureDetailBean.setDevice_id(blPreciseExposureBean.getDevice_id());
mlPreciseExposureDetailBean.setCreate_time_date(blPreciseExposureBean.getCreate_time_date());
mlPreciseExposureDetailBean.setCreate_time_day(blPreciseExposureBean.getCreate_time_day());
mlPreciseExposureDetailBean.setGm_nginx_time_date(blPreciseExposureBean.getGm_nginx_time_date());
mlPreciseExposureDetailBean.setGm_nginx_time_day(blPreciseExposureBean.getGm_nginx_time_day());
mlPreciseExposureDetailBean.setPreciseexposure_num(1);
//1.11 transaction_type的空值需要被修正
//问题描述:transaction_type='' 需要替换为NULL
mlPreciseExposureDetailBeanDetailList.add(BeanReflectUtil.setNullValue(mlPreciseExposureDetailBean));
}
return mlPreciseExposureDetailBeanDetailList;
}
}
package com.gmei.function;
import com.gmei.bean.bl.BlPreciseExposureBean;
import com.gmei.bean.bl.BlPreciseExposureParamsExposureCardsBean;
import com.gmei.bean.ml.MlPreciseExposureDetailBean;
import com.gmei.utils.BeanReflectUtil;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.util.Collector;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* ClassName: MlpreciseExposureDetailFlatMapFunction
* Function:
* Reason: ML层明细数据清洗转换器(一对多)
* Date: 2020/04/22 上午11:01
*
* @author liuzhe
* @since JDK 1.8
*/
public class MlpreciseExposureDetailMapFunction implements MapFunction<BlPreciseExposureBean, ArrayList<MlPreciseExposureDetailBean>> {
/**
* Function: mapBlPreciseExposure
* Reason: 数据爆炸(LATERAL VIEW EXPLODE)并且存储为List
* Date: 2019/12/25 下午5:14
*
* @author liuzhe
* @since JDK 1.8
*/
@Override
public ArrayList<MlPreciseExposureDetailBean> map(BlPreciseExposureBean blPreciseExposureBean) throws Exception {
ArrayList<BlPreciseExposureParamsExposureCardsBean> exposure_cards = blPreciseExposureBean.getExposure_cards();
String app_version = blPreciseExposureBean.getApp_version();
String device_os_type = blPreciseExposureBean.getDevice_os_type();
ArrayList<MlPreciseExposureDetailBean> mlPreciseExposureDetailBeanDetailList = new ArrayList<>();
for(BlPreciseExposureParamsExposureCardsBean exposureCardsBean: exposure_cards) {
String card_id = exposureCardsBean.getCard_id();
String card_content_type = exposureCardsBean.getCard_content_type();
String card_type = exposureCardsBean.getCard_type();
String card_name = exposureCardsBean.getCard_name();
String target_name = exposureCardsBean.getTarget_name();
String is_cpc = exposureCardsBean.getIs_cpc();
String cpc_referer = exposureCardsBean.getCpc_referer();
String absolute_position = exposureCardsBean.getAbsolute_position();
String relative_position = exposureCardsBean.getRelative_position();
String transaction_type = exposureCardsBean.getTransaction_type();
//1.3 绝对位置和相对位置位置错误
//问题描述:在'7.7.35','7.7.36' android的绝对位置和相对位置写反
if("android".equals(device_os_type) && ("7.7.35".equals(app_version) || "7.7.36".equals(app_version))) {
String change = absolute_position;
absolute_position = relative_position;
relative_position = change;
}
//1.10 banner、豆腐块、icon、搜索词和功能区入口的card_type参数问题
//问题描述:当卡片类型为豆腐块、icon、banner、搜索词和功能区入口的时候的时候正确的card_type的参数值被赋给了card_content_type(banner、icon、gadget、search_query、function_entrance)
List<String> card_content_type_list = Arrays.asList("banner","icon","gadget","search_query","function_entrance");
if (card_content_type_list.contains(card_content_type)) {
card_type = card_content_type;
card_content_type = null;
}
if ("search_query".equals(card_type)) {
card_type = "search_word";
}
//1.14 百科卡片曝光新增参数wiki_type
//问题:从7.19.0版本开始,百科卡片曝光,新增了wiki_type参数
//1.12 card_content_type的qa值应该被换成q_a
if ("qa".equals(card_content_type)) {
card_content_type = card_content_type.replace("qa","q_a");
}
//card_type为card的标准码值为common_card,数据中为card
if("card".equals(card_type)) {
card_type = "common_card";
}
//card_type为banner的标准码值为common_banner,数据中为banner
if("banner".equals(card_type)) {
card_type = "common_banner";
}
//card_type为video的标准码值为video_card,数据中为video
if("video".equals(card_type)) {
card_type = "video_card";
}
//1.16 初期的搜索词曝光业务类型运营有promote,operating字段,需要修正为operation
if("promote".equals(transaction_type) || "operating".equals(transaction_type)) {
transaction_type = "operation";
}
MlPreciseExposureDetailBean mlPreciseExposureDetailBean = new MlPreciseExposureDetailBean();
mlPreciseExposureDetailBean.setDay_id(blPreciseExposureBean.getDay_id());
mlPreciseExposureDetailBean.setUser_id(blPreciseExposureBean.getUser_id());
mlPreciseExposureDetailBean.setAction(blPreciseExposureBean.getAction());
mlPreciseExposureDetailBean.setPage_code(blPreciseExposureBean.getPage_code());
mlPreciseExposureDetailBean.setTab_name(blPreciseExposureBean.getTab_name());
mlPreciseExposureDetailBean.setBusiness_id(blPreciseExposureBean.getBusiness_id());
mlPreciseExposureDetailBean.setReferrer_code(blPreciseExposureBean.getReferrer_code());
mlPreciseExposureDetailBean.setReferrer_id(blPreciseExposureBean.getReferrer_id());
mlPreciseExposureDetailBean.setCard_id(card_id);
mlPreciseExposureDetailBean.setCard_content_type(card_content_type);
//1.13 target_name与card_name的参数的统一
//问题描述:将target_name参数的值赋给card_name
mlPreciseExposureDetailBean.setCard_name(card_name == null ? target_name : card_name);
mlPreciseExposureDetailBean.setCard_type(card_type);
mlPreciseExposureDetailBean.setIs_cpc(is_cpc);
mlPreciseExposureDetailBean.setCpc_referer(cpc_referer);
// mlPreciseExposureDetailBean.setAbsolute_position(absolute_position);
// mlPreciseExposureDetailBean.setRelative_position(relative_position);
mlPreciseExposureDetailBean.setTransaction_type(transaction_type);
mlPreciseExposureDetailBean.setFilter(blPreciseExposureBean.getFilter());
mlPreciseExposureDetailBean.setQuery(blPreciseExposureBean.getQuery());
// mlPreciseExposureDetailBean.setChannel_id(blPreciseExposureBean.getApp_channel());
mlPreciseExposureDetailBean.setApp_version(blPreciseExposureBean.getApp_version());
mlPreciseExposureDetailBean.setCurrent_city_id(blPreciseExposureBean.getApp_current_city_id());
mlPreciseExposureDetailBean.setApp_code(blPreciseExposureBean.getApp_code());
mlPreciseExposureDetailBean.setDevice_os_type(blPreciseExposureBean.getDevice_os_type());
mlPreciseExposureDetailBean.setDevice_id(blPreciseExposureBean.getDevice_id());
mlPreciseExposureDetailBean.setCreate_time_date(blPreciseExposureBean.getCreate_time_date());
mlPreciseExposureDetailBean.setCreate_time_day(blPreciseExposureBean.getCreate_time_day());
mlPreciseExposureDetailBean.setGm_nginx_time_date(blPreciseExposureBean.getGm_nginx_time_date());
mlPreciseExposureDetailBean.setGm_nginx_time_day(blPreciseExposureBean.getGm_nginx_time_day());
mlPreciseExposureDetailBean.setPreciseexposure_num(1);
//1.11 transaction_type的空值需要被修正
//问题描述:transaction_type='' 需要替换为NULL
mlPreciseExposureDetailBeanDetailList.add(BeanReflectUtil.setNullValue(mlPreciseExposureDetailBean));
}
return mlPreciseExposureDetailBeanDetailList;
}
}
......@@ -82,6 +82,28 @@ public class MysqlJdbcMl {
// System.out.println(printRealSql(sql, params).replaceAll("(\\s+|\\\\n)", ""));
}
public void updateBatch(String sql, List<List<Object>> paramsList) throws SQLException {
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (List<Object> params : paramsList) {
if (params != null && params.size() > 0) {
for (int i = 0; i < params.size(); i++) {
ps.setObject(i + 1, params.get(i));
}
ps.addBatch();
}
}
int[] resultNumArray = ps.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
} finally {
ps.close();
}
// System.out.println(printRealSql(sql, params).replaceAll("(\\s+|\\\\n)", ""));
}
public void insert(String sql) throws SQLException {
Statement st = null;
try {
......
package com.gmei.sink;
import com.gmei.bean.ml.MlPreciseExposureDetailBean;
import com.gmei.cache.MlPreciseExposureDetailDao;
import com.gmei.jdbc.MysqlJdbcMl;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import java.sql.Connection;
import java.util.ArrayList;
/**
* ClassName: MlPreciseExposureMysqlSink
* Function:
* Reason: 数据下发mysql
* Date: 2019/12/16 下午6:45
*
* @author liuzhe
* @since JDK 1.8
*/
public class MlPreciseExposureDetailMysqlSink extends RichSinkFunction<ArrayList<MlPreciseExposureDetailBean>> {
private MysqlJdbcMl mysqlJdbcMl;
private Connection conn;
private MlPreciseExposureDetailDao mlPreciseExposureDetailDao;
private int maxRetry = 1;
private long retryTime = 3000;
private String sinkJdbcUrl;
private String sinkTableName;
public MlPreciseExposureDetailMysqlSink(String sinkJdbcUrl, String sinkTableName) {
this.sinkJdbcUrl = sinkJdbcUrl;
this.sinkTableName = sinkTableName;
}
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
mysqlJdbcMl = MysqlJdbcMl.getInstance(sinkJdbcUrl);
mlPreciseExposureDetailDao = new MlPreciseExposureDetailDao(sinkJdbcUrl, sinkTableName);
conn = mysqlJdbcMl.getConnection();
}
@Override
public void invoke(ArrayList<MlPreciseExposureDetailBean> value, Context context) throws Exception {
try {
conn.setAutoCommit(false);
mlPreciseExposureDetailDao.insertMlPreciseExposureBatch(value);
conn.commit();
} catch (Exception e) {
conn.rollback();
int numRetry = 1;
Exception lastException = e;
while (numRetry <= maxRetry) {
try {
numRetry ++;
Thread.sleep(retryTime);
mysqlJdbcMl.close(conn, null, null);
conn = mysqlJdbcMl.getConnection();
conn.setAutoCommit(false);
mlPreciseExposureDetailDao.insertMlPreciseExposureBatch(value);
conn.commit();
} catch (Exception e1) {
conn.rollback();
lastException = e1;
continue;
}
return;
}
throw lastException;
}
}
@Override
public void close() throws Exception {
super.close();
mysqlJdbcMl.close(conn, null, null);
}
}
......@@ -89,7 +89,7 @@ CREATE TABLE `bl_et_mg_preciseexposure_inc_d_rt` (
`is_popup` varchar(20) DEFAULT NULL COMMENT '是否弹窗',
`filter` varchar(50) DEFAULT NULL COMMENT '筛选器',
`query` varchar(200) DEFAULT NULL COMMENT '搜索词',
`app_grey_type` varchar(200) DEFAULT NULL COMMENT '灰度列表',
`app_grey_type` longtext DEFAULT NULL COMMENT '灰度列表',
`app_channel` varchar(20) DEFAULT NULL COMMENT 'APP渠道',
`app_version` varchar(20) DEFAULT NULL COMMENT 'APP版本',
`app_current_city_id` varchar(20) DEFAULT NULL COMMENT '当前城市ID',
......@@ -149,6 +149,50 @@ CREATE TABLE `ml_c_et_pe_preciseexposure_dimen_d_rt` (
) COMMENT='ML层精准曝光实时表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
;
CREATE TABLE `ml_c_et_pe_preciseexposuredetail_dimen_d_rt` (
`day_id` date DEFAULT NULL COMMENT '账期日',
`user_id` varchar(20) DEFAULT NULL COMMENT '用户ID',
`action` varchar(30) DEFAULT NULL COMMENT '事件接口',
`page_code` varchar(50) DEFAULT NULL COMMENT '页面编码',
`page_name` varchar(50) DEFAULT NULL COMMENT '页面名称',
`tab_name` varchar(50) DEFAULT NULL COMMENT 'TAB名称',
`business_id` varchar(50) DEFAULT NULL COMMENT '业务ID',
`referrer_code` varchar(50) DEFAULT NULL COMMENT '来源页编码',
`referrer_name` varchar(50) DEFAULT NULL COMMENT '来源页名称',
`referrer_id` varchar(50) DEFAULT NULL COMMENT '来源页业务ID',
`card_id` varchar(100) DEFAULT NULL COMMENT '卡片ID',
`card_name` varchar(200) DEFAULT NULL COMMENT '卡片名称',
`card_content_type` varchar(50) DEFAULT NULL COMMENT '卡片内容类型',
`card_content_type_name` varchar(50) DEFAULT NULL COMMENT '卡片内容类型名称',
`card_type` varchar(50) DEFAULT NULL COMMENT '卡片类型',
`card_type_name` varchar(50) DEFAULT NULL COMMENT '卡片类型',
`is_cpc` varchar(20) DEFAULT NULL COMMENT '是否CPC',
`cpc_referer` varchar(50) DEFAULT NULL COMMENT 'CPC来源',
`transaction_type` varchar(50) DEFAULT NULL COMMENT '业务类型',
`transaction_type_name` varchar(50) DEFAULT NULL COMMENT '业务类型名称',
`filter` varchar(50) DEFAULT NULL COMMENT '筛选器',
`query` varchar(200) DEFAULT NULL COMMENT '搜索词',
`app_version` varchar(20) DEFAULT NULL COMMENT 'APP版本',
`current_city_id` varchar(20) DEFAULT NULL COMMENT '当前城市ID',
`current_city_name` varchar(20) DEFAULT NULL COMMENT '当前城市名称',
`current_province_id` varchar(20) DEFAULT NULL COMMENT '当前省份ID',
`current_province_name` varchar(20) DEFAULT NULL COMMENT '当前省份名称',
`current_country_id` varchar(20) DEFAULT NULL COMMENT '当前国家ID',
`current_country_name` varchar(20) DEFAULT NULL COMMENT '当前国家名称',
`current_region_id` varchar(20) DEFAULT NULL COMMENT '当前区域ID',
`current_region_name` varchar(20) DEFAULT NULL COMMENT '当前区域名称',
`app_code` varchar(20) DEFAULT NULL COMMENT 'APP编码',
`device_os_type` varchar(20) DEFAULT NULL COMMENT '设备系统类型',
`device_id` varchar(50) DEFAULT NULL COMMENT '设备ID',
`create_time_date` varchar(30) DEFAULT NULL COMMENT '日志创建时间',
`create_time_day` varchar(30) DEFAULT NULL COMMENT '日志创建日期',
`gm_nginx_time_date` varchar(30) DEFAULT NULL COMMENT '日志接收时间',
`gm_nginx_time_day` varchar(30) DEFAULT NULL COMMENT '日志接收日期',
`preciseexposure_num` int(11) DEFAULT NULL COMMENT '精准曝光数量',
KEY `idx_ml_preciseexposure` (`day_id`,`page_code`,`page_name`,`referrer_code`,`referrer_name`,`card_content_type`,`card_content_type_name`,`card_type`,`card_type_name`,`transaction_type`,`transaction_type_name`,`current_city_id`,`device_os_type`)
) COMMENT='ML层精准曝光明细实时表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
;
SELECT t1.CODE,
t1.pk,
t1.NAME,
......
......@@ -2,8 +2,10 @@ package com.gmei.streaming;
import com.gmei.bean.bl.BlPreciseExposureBean;
import com.gmei.bean.ml.MlPreciseExposureBean;
import com.gmei.bean.ml.MlPreciseExposureDetailBean;
import com.gmei.function.*;
import com.gmei.sink.BlPreciseExposureMysqlSink;
import com.gmei.sink.MlPreciseExposureDetailMysqlSink;
import com.gmei.sink.MlPreciseExposureMysqlSink;
import com.gmei.source.BlMaiDianKafkaSource;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
......@@ -20,6 +22,7 @@ import org.apache.flink.streaming.api.windowing.triggers.EventTimeTrigger;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011;
import org.apache.flink.util.OutputTag;
import java.util.ArrayList;
import java.util.concurrent.*;
......@@ -58,6 +61,7 @@ public class PreciseExposureStreaming {
String sinkMlJdbcUrl = null;
String sinkBlTableName = null;
String sinkMlTableName = null;
String sinkMlDetailTableName = null;
Integer windowSize = null;
Integer parallelism = null;
String startTime = null;
......@@ -77,6 +81,7 @@ public class PreciseExposureStreaming {
sinkMlJdbcUrl = parameterTool.getRequired("sinkMlJdbcUrl");
sinkBlTableName = parameterTool.getRequired("sinkBlTableName");
sinkMlTableName = parameterTool.getRequired("sinkMlTableName");
sinkMlDetailTableName = parameterTool.getRequired("sinkMlDetailTableName");
// Boolean startFromLatest = parameterTool.getBoolean("startFromLatest", false);
windowSize = parameterTool.getInt("windowSize", 30);
parallelism = parameterTool.getInt("parallelism", 1);
......@@ -188,6 +193,18 @@ public class PreciseExposureStreaming {
.uid("id_mlpreciseexposure_sink")
.setParallelism(parallelism);
/*
Ml层明细数据爆炸
*/
SingleOutputStreamOperator<ArrayList<MlPreciseExposureDetailBean>> mlPreciseExposureDetailBeanStream = blPreciseExposureStream
.map(new MlpreciseExposureDetailMapFunction())
.uid("id_mlpreciseexposuredetail_flatmap")
.setParallelism(parallelism);
mlPreciseExposureDetailBeanStream
.addSink(new MlPreciseExposureDetailMysqlSink(sinkMlJdbcUrl, sinkMlDetailTableName))
.setParallelism(parallelism);
env.execute("ml_c_et_pe_preciseexposure_dimen_d_rt");
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment