目录
Session聚合分析解析 步骤
构建spark上下文 查取需要执行任务
//构建spark上下文
SparkConf conf=new SparkConf().setAppName(MyConstants.SPARK_APP_NAME_SESSION).setMaster("local[*]");
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlContext=getSQLContext(sc.sc());
//生成模拟数据
mockData(sc,sqlContext);
//创建使用的DAO组件
ITaskDAO taskDao = DAOFactory.getTaskDAO();
//首先查出指定任务,并获取任务查询参数
Long taskId = ParamUtils.getTaskIdFromArgs(args, MyConstants.SPARK_LOCAL_TASKID_SESSION);
Task task = taskDao.findById(taskId);
JSONObject taskParam = JSONObject.parseObject(task.getTaskParam());
获取session对应的action信息
// 如果要进行session粒度的数据聚合
// 首先要从user_visit_action表中,查询出来指定日期范围内的行为数据
/**
* actionRDD,就是一个公共RDD
* 第一,要用ationRDD,获取到一个公共的sessionid为key的PairRDD
* 第二,actionRDD,用在了session聚合环节里面
*
* sessionid为key的PairRDD,是确定了,在后面要多次使用的
* 1、与通过筛选的sessionid进行join,获取通过筛选的session的明细数据
* 2、将这个RDD,直接传入aggregateBySession方法,进行session聚合统计
*
* 重构完以后,actionRDD,就只在最开始,使用一次,用来生成以sessionid为key的RDD
*
*/
JavaRDD<Row> actionRDD = SparkUtils.getActionRDDByDateRange(sqlContext, taskParam);
JavaPairRDD<String, Row> sessionid2actionRDD = getSessionid2ActionRDD(actionRDD);
/**
* 获取sessionid2到访问行为数据的映射的RDD
* @param actionRDD
* @return
*/
public static JavaPairRDD<String, Row> getSessionid2ActionRDD(JavaRDD<Row> actionRDD) {
// return actionRDD.mapToPair(new PairFunction<Row, String, Row>() {
//
// private static final long serialVersionUID = 1L;
//
// @Override
// public Tuple2<String, Row> call(Row row) throws Exception {
// return new Tuple2<String, Row>(row.getString(2), row);
// }
//
// });
return actionRDD.mapPartitionsToPair(new PairFlatMapFunction<Iterator<Row>, String, Row>() {
private static final long serialVersionUID = 1L;
@Override
public Iterable<Tuple2<String, Row>> call(Iterator<Row> iterator)
throws Exception {
List<Tuple2<String, Row>> list = new ArrayList<Tuple2<String, Row>>();
while(iterator.hasNext()) {
Row row = iterator.next();
list.add(new Tuple2<String, Row>(row.getString(2), row));
}
return list;
}
});
}
对行为数据按session粒度进行聚合
// 首先,可以将行为数据,按照session_id进行groupByKey分组
// 此时的数据的粒度就是session粒度了,然后呢,可以将session粒度的数据
// 与用户信息数据,进行join
// 然后就可以获取到session粒度的数据,同时呢,数据里面还包含了session对应的user的信息
// 到这里为止,获取的数据是<sessionid,(sessionid,searchKeywords,clickCategoryIds,age,professional,city,sex)>