大数据之指标计算(1)-- 使用Spark根据dwd层fact_change_record表统计每个月、每个设备、每种状态的时长,并将结果存入mysql数据库

目录

前言

题目:

一、读题分析

二、处理过程

三、重难点分析

总结 


前言

本题来源于全国职业技能大赛之大数据技术赛项工业数据处理赛题 - 离线数据处理 - 指标计算

注:由于个人设备问题,代码执行结果以及最后数据显示结果将不会给出。

题目:

b6ee541df5cc40efbc4c487de020383e.png


提示:以下是本篇文章正文内容,下面案例可供参考(使用Scala语言编写) 

一、读题分析

涉及组件:Spark,Scala,MySQL

涉及知识点:

  1. 数据处理计算
  2. spark函数的使用

二、处理过程

  直接上代码

package A.offlineDataProcessing.shtd_industry.task3_indicatorCalculation

import org.apache.spark.sql.functions.{month, unix_timestamp, year}
import org.apache.spark.sql.{DataFrame, SparkSession, functions}

import java.util.Properties

/*
1.读取dwd层fact_change_record表中的数据,并将其加载到Spark DataFrame中。
2.对fact_change_record表中的数据进行处理,进行以下操作:
对于每个设备,仅保留其change_start_time字段月份相同的记录。
如果change_end_time字段为空,则该记录不参与计算。
对于剩余的记录,根据change_start_time和change_end_time计算每个设备的每种状态的持续时长,并存储结果到一个新的DataFrame中。
3.将统计结果存储到MySQL数据库shtd_industry的machine_state_time表中。
4.在MySQL命令行中,使用逆序排序命令,查询出前10条结果。
*/
object answer_No1 {

  def main(args: Array[String]): Unit = {
    // 创建spark session
    val spark = SparkSession.builder().appName("calculate").master("local[*]").enableHiveSupport().getOrCreate()

    // 读取hive中的dwd层fact_change_record表数据
    val df: DataFrame = spark.sql(
      """
        |SELECT ChangeMachineID, ChangeRecordState, ChangeStartTime,
        |      ChangeEndTime FROM dwd .fact_change_record
        |      WHERE ChangeEndTime IS NOT NULL
        |""".stripMargin
    )

    // 统计每个月、每个设备、每种状态的时长
    /**
     * df()相当于df.apply()查询列
     * year()识别列的年份
     * alias()将列命名为
     * agg()里面放的是聚合函数,用于对数据进行聚合操作
     * unix_timestamp将选中列转换为一个时间戳
     */
    val result = df.groupBy(
      df("ChangeMachineID").alias("machine_id"),
      df("ChangeRecordState").alias("change_record_state"),
      year(df("ChangeStartTime")).alias("year"),
      month(df("ChangeStartTime")).alias("month")
    ).agg(
      functions.sum(
        unix_timestamp(df("ChangeEndTime")) -
          unix_timestamp(df("ChangeStartTime"))
      ).alias("duration_time")
    ).select("machine_id", "change_record_state", "duration_time", "year", "month")

    //    df.show()
    // 写入MySQL数据库
    val url = "jdbc:mysql://192.168.59.100:3306/shtd_industry"
    val prop = new Properties()
    prop.setProperty("user", "root")
    prop.setProperty("password", "123456")
    //mysql数据库的类型是latin1,不支持写入中文,显示为??,在spark集群中中文显示ok
    result.write.jdbc(url, "machine_state_time", prop)

    // 关闭spark session
    spark.stop()

    /*
        bin/spark-submit --master spark://hadoop100:7077 --class org.shtd_industry.task3_indicatorCalculation
        .answer_No1 --conf "spark.executor.extraJavaOptions=-Dfile.encoding=UTF-8" --conf "spark.driver
        .extraJavaOptions=-Dfile.encoding=UTF-8" /opt/datas/bigdata-1.0-SNAPSHOT.jar
     */
  }
}

看过往期的代码,这个代码理解起来应该不难


三、重难点分析

        聚合函数的使用,主要是对数据处理的思路和方法。习惯后,遇到类似题可以熟练掌握。

        本期为指标计算第1篇,后续应该还会出5篇。


总结 

        本文将介绍如何使用Scala和Spark对数据库中的数据进行ETL以及计算,最终将结果存储到MySQL数据库中。具体实现过程包括:使用Spark读取数据库表格,数据预处理和清洗,按月、设备、状态统计持续时长,将结果存储到MySQL数据库的特定表格中,最后使用MySQL命令行查询结果。

        本文还包括前10条设备状态持续时间最长的数据的SQL语句和执行结果的截图,以加强读者对实现过程的理解和实际应用场景的认识。

        请关注我的大数据技术专栏大数据技术 作者: Eternity.Arrebol

        请关注我获取更多与大数据相关的文章Eternity.Arrebol的博客

 

 

 

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,你可以按照以下步骤进行操作: 1. 在Hive中创建dwd库和fact_change_record,并添加分区字段和新增的四列: ``` CREATE DATABASE IF NOT EXISTS dwd; USE dwd; CREATE TABLE IF NOT EXISTS fact_change_record ( changeid INT, changemachineid INT, changetype STRING, changereason STRING, changedate STRING, etldate STRING, dwd_insert_user STRING, dwd_insert_time TIMESTAMP, dwd_modify_user STRING, dwd_modify_time TIMESTAMP ) PARTITIONED BY (etldate STRING); ``` 2. 对ods库中的changerecord进行联合去重处理,将结果写入临时temp_change_record中: ``` USE ods; CREATE TABLE IF NOT EXISTS temp_change_record AS SELECT DISTINCT changeid, changemachineid, changetype, changereason, changedate, etldate FROM changerecord; ``` 3. 使用INSERT INTO语句将临时中的数据插入到dwd库的fact_change_record中,同时添加分区字段和新增的四列: ``` USE dwd; INSERT INTO TABLE fact_change_record PARTITION (etldate='2022-01-01') SELECT changeid, changemachineid, changetype, changereason, changedate, etldate, 'user1' AS dwd_insert_user, CAST(FROM_UNIXTIME(UNIX_TIMESTAMP()) AS TIMESTAMP) AS dwd_insert_time, 'user1' AS dwd_modify_user, CAST(FROM_UNIXTIME(UNIX_TIMESTAMP()) AS TIMESTAMP) AS dwd_modify_time FROM temp_change_record; ``` 其中,etldate的值可以根据你的需求进行修改。 4. 查看抽取结果: ``` USE dwd; SELECT * FROM fact_change_record; ``` 这样就可以将ods库中changerecord的数据抽取到dwd库的fact_change_record中,并进行了联合去重处理和添加了新增的四列。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

约定Da于配置

你的鼓励就是我最大的动力哥们

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值