91.Spark大型电商项目-页面单跳转化率-编写基础代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/someby/article/details/88918748

目录

代码

ConfigurationManager.java

Constants.java

ParamUtils.java

SparkUtils.java

my.properties

PageOneStepConvertRateSpark.java


本篇文章记录页面单跳转化率-编写基础代码。

由于基础数据是用户访问session分析模块基于的基础数据所以很多的方法和session模块中的spark作业中的代码一样,想在我们将这样的代码块提取出来作为方法进行复用。

代码

conf包

ConfigurationManager.java

/**
     * 获取Long类型的配置项
     * @param key
     * @return
     */

    public static Long getLong(String key){
        String value = getProperty(key);
        try {
            return Long.valueOf(value);
        } catch ( Exception e){
            e.printStackTrace();
        }
        return 0L;
    }

constants包

Constants.java


    /**
     * 数据库相关的常量
     */

    String SPARK_LOCAL_TASKID_SESSION = "spark.local.taskid.session";
    String SPARK_LOCAL_TASKID_PAGE = "spark.local.taskid.page";


    /**
     * Spark作业相关的常量
     */

    String SPARK_APP_NAME_PAGE = "PageOneStepConvertRateSpark";
    

util包

ParamUtils.java

    /**
     * 从命令行中获取任务id
     * @param args 命令行参数
     * @return 任务id
     */

    public static Long getTaskIdFromArgs(String[] args,String taskType){
        boolean local = ConfigurationManager.getBoolean(Constants.SPARK_LOCAL);
        if (local){
            return ConfigurationManager.getLong(taskType);
        }else{
            try{
                if (args != null && args.length > 0){
                    return Long.valueOf(args[0]);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return null;
    }

SparkUtils.java

package graduation.java.util;

import com.alibaba.fastjson.JSONObject;
import graduation.java.conf.ConfigurationManager;
import graduation.java.constant.Constants;
import graduation.java.test.MockData;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.hive.HiveContext;

/**
 * FileName: SparkUtils
 * Author:   hadoop
 * Email:    [email protected]
 * Date:     19-3-30 下午7:46
 * Description:
 * Spark工具类
 */
public class SparkUtils {
    /**
     * 根据当前是否是本地测试模式配置来决定
     * 如果设置SparkConf的master
     * @param conf
     */

    public static  void setMaster(SparkConf conf){
        boolean local = ConfigurationManager.getBoolean(Constants.SPARK_LOCAL);
        if (local){
            conf.setMaster("local");
        }
    }
    /**
     * 获取SQLContext
     * 如果是在本地测试环境的话,那么就生成SQLContext对象
     * 如果是在生产环境运行的话,那么就生成HiveContext对象
     * @param sc SparkContext
     * @return SQLContext
     */
    public static SQLContext getSQLContext(SparkContext sc) {
        boolean local = ConfigurationManager.getBoolean(Constants.SPARK_LOCAL);
        if(local) {
            return new SQLContext(sc);
        } else {
            return new HiveContext(sc);
        }
    }
    /**
     * 生成模拟数据(只有本地模式,才会去生成模拟数据)
     * @param sc
     * @param sqlContext
     */
    public static void mockData(JavaSparkContext sc, SQLContext sqlContext) {
        boolean local = ConfigurationManager.getBoolean(Constants.SPARK_LOCAL);
        if(local) {
            MockData.mock(sc, sqlContext);
        }
    }

    /**
     * 获取指定日期范围内的用户访问行为数据
     * @param sqlContext SQLContext
     * @param taskParam 任务参数
     * @return 行为数据RDD
     */
    public static JavaRDD<Row> getActionRDDByDateRange(
            SQLContext sqlContext, JSONObject taskParam) {
        String startDate = ParamUtils.getParam(taskParam, Constants.PARAM_START_DATE);
        String endDate = ParamUtils.getParam(taskParam, Constants.PARAM_END_DATE);

        String sql =
                "select * "
                        + "from user_visit_action "
                        + "where date>='" + startDate + "' "
                        + "and date<='" + endDate + "'";

        Dataset actionDF = sqlContext.sql(sql);
        System.out.println("actionDF");
        actionDF.show(10);
        /**
         * 这里就很有可能发生上面说的问题
         * 比如说,Spark SQl默认就给第一个stage设置了20个task,但是根据你的数据量以及算法的复杂度
         * 实际上,你需要1000个task去并行执行
         *
         * 所以说,在这里,就可以对Spark SQL刚刚查询出来的RDD执行repartition重分区操作
         */
        //return  actionDF.javaRDD().repartition(100);

        return actionDF.javaRDD();
    }
}

resources包

my.properties

spark.local.taskid.session=1
spark.local.taskid.page=2

spark..page包

PageOneStepConvertRateSpark.java

package graduation.java.spark.page;

import com.alibaba.fastjson.JSONObject;
import graduation.java.constant.Constants;
import graduation.java.dao.ITaskDAO;
import graduation.java.domain.Task;
import graduation.java.factory.DAOFactory;
import graduation.java.util.ParamUtils;
import graduation.java.util.SparkUtils;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SQLContext;

import java.util.Date;

/**
 * FileName: PageOneStepConvertRateSpark
 * Author:   hadoop
 * Email:    [email protected]
 * Date:     19-3-30 下午8:00
 * Description:
 * 页面单跳转化率模块spark作业
 */
public class PageOneStepConvertRateSpark {
    public static void main(String[] args) {
        //1.构建SparkConf上下文
        SparkConf conf  = new SparkConf()
                .setAppName(Constants.SPARK_APP_NAME_PAGE);

        SparkUtils.setMaster(conf);


        JavaSparkContext sc = new JavaSparkContext(conf);
        SQLContext sqlContext =  SparkUtils.getSQLContext(sc.sc());

        //2.生成模拟数据
        SparkUtils.mockData(sc,sqlContext);
        //3.查询任务、获取任务参数
        long taskid = ParamUtils.getTaskIdFromArgs(args,Constants.SPARK_LOCAL_TASKID_PAGE);
        ITaskDAO taskDAO = DAOFactory.getTaskDAO();
        Task task = taskDAO.findById(taskid);
        if (task == null){
            System.out.println(new Date() + ": cannot find this task with id ["+ taskid+ "]");
            return;
        }


        JSONObject taskParam = JSONObject.parseObject(task.getTaskParam());
        //4.查询指定日期内的用户访问数据
        JavaRDD<Row> actionRDD = SparkUtils.getActionRDDByDateRange(sqlContext,taskParam);

    }
}

猜你喜欢

转载自blog.csdn.net/someby/article/details/88918748
今日推荐