【Spark】MLlib mark a demo(二)

标记一个DEMO以便于后面复习
DEMO背景阿里天池竞赛系列 口碑商家客流量预测

第二步数据整理

星期几第几天商家id浏览量购买量
星期一11024600342
package com.huadian.bigdata.ijcai

import java.util.Date

import org.apache.spark.sql.{SaveMode, SparkSession}

object IJCAIUserCountSpark {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession
      .builder()
      .appName("SparkSQLDemo")
      .master("local[5]")
      .config("spark.sql.shuffle.partitions",2)
      .getOrCreate()

    spark.sparkContext.setLogLevel("WARN")
    import spark.implicits._

    /**
      * 统计 训练 数据集 中各个 商家 每天的用户浏览数和用户支付数
      * date_str,shop_id,count_visit,count_pay
      */
    //统计训练用户浏览量数据
    val trinUserViewDf = spark.read
      .option("header","true")
      .csv("file:///F:/IJCAI/train_user_view")

    trinUserViewDf.createOrReplaceTempView("view_tmp_train_user_view")

    val trainPerDayUserVisitCountDF = spark.sql(
      """
        |select
        | substring(time_stamp,0,10) as date_str,
        | shop_id,
        | count(1) as count_visit
        |from
        |   view_tmp_train_user_view
        |group by
        |   substring(time_stamp,0,10),shop_id
      """.stripMargin)
    trainPerDayUserVisitCountDF.show(20,false)


    //对用户支付行为数据统计,使用DSL
    val trainUserPayDF = spark.read
      .option("header","true")
      .csv("file:///F:/IJCAI/train_user_pay")


    val trainPryDayUserPayCountDf = trainUserPayDF
      .selectExpr("substring(time_stamp,0,10) as date_str","shop_id")
      .groupBy($"date_str", $"shop_id").count()
      .selectExpr("date_str","shop_id","count as count_pay")

    trainPryDayUserPayCountDf.show(20)

    spark.udf.register(
      "get_weekday",
      (dateTime:String)=>{
        import java.text.SimpleDateFormat
        val f: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd")
        val f1: SimpleDateFormat = new SimpleDateFormat("EEEE")
        val dd: Date =f.parse(dateTime)
        f1.format(dd)
      }
    )
    spark.udf.register(
      "get_day_week",
      (dateTime:String)=>{
        import java.text.SimpleDateFormat
        import java.util.Calendar
        val f: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd")
        val cal: Calendar = Calendar.getInstance
        // 获得一个日历
        try {
          val datet = f.parse(dateTime)
          cal.setTime(datet)
        } catch {
          case e:Exception =>
            Nil
        }
        cal.get(Calendar.DAY_OF_WEEK)-1 // 指示一个星期中的某天。
      }
    )

    //合并结果:每天各个商家 浏览量和 客户支付量统计
    val trainPrerDayUserDF  =trainPerDayUserVisitCountDF
      .join(trainPryDayUserPayCountDf,Seq("date_str", "shop_id"))
      //对于特征值来讲,我们需要的是周一
      .selectExpr(
      "get_weekday(date_str) as weekday", //将日期转成 星期几
      "get_day_week(date_str) as  day_week",//一周的第几天
      "shop_id","count_visit","count_pay"
    )

    trainPrerDayUserDF
      .coalesce(1)
      .write
      .mode(SaveMode.Overwrite)
      .option("header","true")
      .csv("file:///F:/IJCAI/train_user_visit_pay")


      spark.close()

  }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值