全国职业院校技能大赛-大数据 离线数据处理模块-指标计算_国赛离线数据处理指标计算(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

| 字段 | 类型 | 中文含义 | 备注 |
| produce_record_id | int | 生产记录id | 每生产一件产品产生一条数据 |
| produce_machine_id | int | 设备id | |
| producetime | int | 该产品耗时 | |
| produce_per_avgtime | int | 设备生产一个产品平均耗时 | 单位:秒 |

执行代码

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

object SparkReadDWDWriteDWS {
  def main(args: Array[String]): Unit = {

    // 创建sparkSession对象
    val conf = new SparkConf().setMaster("local[*]").setAppName("sparkSession")
    val spark: SparkSession = SparkSession.builder()
      .config(conf)
      .enableHiveSupport()
      .getOrCreate()

    // 启动动态分区
    spark.conf.set("hive.exec.dynamic.partition.mode", "nonstrict")
    // 关闭日志打印
    spark.sparkContext.setLogLevel("OFF")

    // 读取数据并剔除脏数据
    val df = spark.read
      .table("dwd.fact_produce_record")
      .filter("ProduceCodeEndTime != '1900-01-01 00:00:00'")
    df.createOrReplaceTempView("tempView")

    // 将查询的结果作为独立的表保存
    // 在group by 中进行联合主键去重
    // 如果使用group by,那么在查询语句中只能显示分组字段和聚合函数
    // 根据设备id进行分组,计算每个设备生产一个设备的平均时间
    val resultDF = spark.sql(
      """
        |SELECT
        |       t1.ProduceRecordID                                                           AS produce_record_id,
        |       t1.ProduceMachineID                                                          AS produce_machine_id,
        |       unix_timestamp(ProduceCodeEndTime) - unix_timestamp(ProduceCodeStartTime)    AS producetime,
        |       AVG(unix_timestamp(ProduceCodeEndTime) - unix_timestamp(ProduceCodeStartTime))
        |           OVER (PARTITION BY ProduceMachineID)                                     AS produce_per_avgtime
        |FROM (
        | SELECT
        |        ProduceRecordID,
        |        ProduceMachineID
        | FROM tempView
        | GROUP BY ProduceRecordID,ProduceMachineID
        | ) t1
        | LEFT JOIN (
        |     SELECT
        |         ProduceCodeStartTime,
        |         ProduceCodeEndTime,
        |         ProduceRecordID,
        |         ProduceMachineID,
        |     FROM tempView
        | ) t2 ON t1.ProduceRecordID = t2.ProduceRecordID
        | AND t1.ProduceMachineID = t2.ProduceMachineID
        |""".stripMargin) // 以ProduceRecordID,ProduceMachineID为联合主键进行去重
    resultDF.show()
    
    // 将数据保存到dws库中的machine_produce_per_avgtime中
    resultDF.write
      .mode("overwrite")
      .saveAsTable("dws.machine_produce_per_avgtime")

    // 使用hive cli根据设备id降序排序查询前3条数据
    // select * from dws.machine_produce_per_avgtime order by id desc limit 3;

    spark.close()
  }
}

3.  编写scala代码,使用Spark根据dws层的machine_produce_per_avgtime表,获取各设备生产耗时最长的两个产品的用时,将计算结果存入MySQL数据库shtd_industry的machine_produce_timetop2表中(表结构如下),然后在Linux的MySQL命令行中根据设备id降序排序,查询出前2条,将SQL语句复制粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下,将执行结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;

字段类型中文含义备注
machine_idint设备id
first_timeint耗时最长
second_timeint耗时次长
package com.atguigu.connecttest.writedws

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

object SparkReadDWDWriteDWS2 {
  def main(args: Array[String]): Unit = {

    // TODO 准备环境
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("spark")
    val spark = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
    // 启动动态分区
    spark.conf.set("hive.exec.dynamic.partition.mode", "nonstrict")
    // 关闭打印日志
    spark.sparkContext.setLogLevel("OFF")

    val df: DataFrame = spark.read.table("dws.machine_produce_per_avgtime")
    // 创建临时表
    df.createOrReplaceTempView("tempView")

    // 这里的数据是基于第2题的结果的
    val hiveDF: DataFrame = spark.sql(
      """
        | select
        | machine_id,
        | if(rk = 1, producetime, null) first_time,
        | if(rk = 2, producetime, null) second_time
        | from (
        |   select
        |     machine_id,
        |     producetime,
        |     rank() over(partition by machine_id order by producetime desc) rk
        |   from tempView
        | ) t
        |""".stripMargin)
    // rank排名函数会可以直接根据machinc_id进行分区排序,因此可以不考虑手动通过group by分区


    // 将计算结果存入mysql
    hiveDF.write
      .format("jdbc")
      .mode(SaveMode.Append)
      .option("Driver", "com.mysql.jdbc.Driver")
      .option("url", "jdbc:mysql://hadoop102:3306/shtd_industry")
      .option("user", "root")
      .option("password", "000000")
      .option("dbtable", "machine_produce_timetop2")
      .save()

    // TODO 关闭连接
    spark.close()
  }
}

在Linux的MySQL命令行中根据设备id降序排序,查询出前2条

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中…(img-C7ze993D-1713376553997)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值