大数据之指标计算(3) -- 使用Spark根据dwd.fact_produce_record表,基于全量历史增加设备生产一个产品的平均耗时字段...将结果写入dws层中指定表

目录

前言

题目:

一、读题分析

二、处理过程

三、重难点分析

总结 


 

前言

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

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

题目:

25e3158124ba4301a58c620a25f7bb42.png

 


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

一、读题分析

涉及组件:Scala,Spark,Hive

涉及知识点:

  1. Hive中联合主键去重
  2. 剔除脏数据

二、处理过程

  -- 代码仅供参考 --

package A.offlineDataProcessing.shtd_industry.task3_indicatorCalculation

import org.apache.spark.sql.SparkSession

object answer_No3 {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("MachineAvgProduceTime").master("spark://hadoop100:7077")
      .enableHiveSupport()
      .getOrCreate()

    val df = spark.read.table("dwd.fact_produce_record").filter("ProduceCodeEndTime != '1900-01-01 00:00:00'")
    df.createOrReplaceTempView("tempView")

    //    spark.sql("select * from tempView limit 5").show()

    val resultDF = spark.sql(
      """
        |SELECT distinct
        |       ProduceRecordID                                                           AS produce_record_id,
        |       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 tempView
        |
        |""".stripMargin)
    resultDF.show()

    resultDF.write.mode("overwrite").saveAsTable("dws.machine_produce_per_avgtime")

    //    在Linux的命令行中根据设备id倒序排序查询前3条数据
    //    select * from machine_produce_per_avgtime order by produce_machine_id desc limit 3;

  }
}

-- 代码仅供参考 --


三、重难点分析

        Hive中联合主键去重(感觉我写的有点问题)

        剔除脏数据(经常使用filter,这里不做赘述)

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


总结 

 

这是一个关于使用Scala和Spark统计设备生产一个产品的平均耗时,并将结果存储在clickhouse数据库中,然后在Linux命令行工具中查询前三条设备id倒序排列的数据的问题。下面是具体的要求和表结构:

  • 在dwd层fact_produce_record表中,基于全量历史增加设备,计算生产一个产品的平均时间字段(produce_per_avgtime),其中produce_code_end_time为1900-01-01 00:00:00的数据为脏数据,需要剔除。每生产一件产品产生一条数据,produce_code_start_time字段为开始加工时间,produce_code_end_time字段为完成加工时间。
  • 将得到的数据提取下表所需字段,然后写入dws层表machine_produce_per_avgtime中,表结构包含produce_record_id(生产记录id)、produce_machine_id(设备id)、producetime(该产品耗时,单位为秒)和produce_per_avgtime(设备生产一个产品平均耗时,单位为秒)字段。
  • 通过Linux的命令行工具查询出前3条设备id倒序排列的设备生产一个产品平均耗时数据,将SQL语句和执行结果截图粘贴到报告中。

注意:这个题目需要掌握Spark编程、clickhouse数据库以及Linux命令行工具的使用。

 

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

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

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在`spark-shell`中,可以按照以下步骤完成上述要求: 1. 读取MySQL中的`MachineData`或者dwd库中的`fact_machine_data`,获取最大分区的数据,并将`machine_record_data`列作为字符串列读入。 ```scala import org.apache.spark.sql.functions._ val machineData = spark.read.jdbc(url, "MachineData", connectionProperties) .select(col("machine_record_id"), col("machine_record_data").cast("string"), col("machine_record_state")) .orderBy(col("machine_record_id").asc) .limit(1) ``` 2. 使用`dom4j`解析`machine_record_data`列中的XML数据,并获取需要的数据项,同时转换`machine_record_state`字段的值。 ```scala import org.dom4j.DocumentHelper val parsedData = machineData.map(row => { val xml = DocumentHelper.parseText(row.getAs[String]("machine_record_data")) val root = xml.getRootElement() val mainSpindleSpeed = root.elementText("MainSpindleSpeed") match { case null => 0 case value => value.toInt } val mainSpindleMultiplier = root.elementText("MainSpindleMultiplier") match { case null => 0 case value => value.toInt } val mainSpindleLoad = root.elementText("MainSpindleLoad") match { case null => 0 case value => value.toInt } val feedMultiplier = root.elementText("FeedMultiplier") match { case null => 0 case value => value.toInt } val feedSpeed = root.elementText("FeedSpeed") match { case null => 0 case value => value.toInt } val pmcProgramNumber = root.elementText("PmcProgramNumber") match { case null => "" case value => value } val cycleTime = root.elementText("CycleTime") match { case null => 0 case value => value.toInt } val runTime = root.elementText("RunTime") match { case null => 0 case value => value.toInt } val effectiveAxisCount = root.elementText("EffectiveAxisCount") match { case null => 0 case value => value.toInt } val totalMachinedParts = root.elementText("TotalMachinedParts") match { case null => 0 case value => value.toInt } val usedMemory = root.elementText("UsedMemory") match { case null => 0 case value => value.toInt } val freeMemory = root.elementText("FreeMemory") match { case null => 0 case value => value.toInt } val availableProgramCount = root.elementText("AvailableProgramCount") match { case null => 0 case value => value.toInt } val registeredProgramCount = root.elementText("RegisteredProgramCount") match { case null => 0 case value => value.toInt } val machineRecordState = row.getAs[String]("machine_record_state") match { case "ALARM" => 1 case _ => 0 } (row.getAs[Int]("machine_record_id"), mainSpindleSpeed, mainSpindleMultiplier, mainSpindleLoad, feedMultiplier, feedSpeed, pmcProgramNumber, cycleTime, runTime, effectiveAxisCount, totalMachinedParts, usedMemory, freeMemory, availableProgramCount, registeredProgramCount, machineRecordState) }).toDF("machine_record_id", "main_spindle_speed", "main_spindle_multiplier", "main_spindle_load", "feed_multiplier", "feed_speed", "pmc_program_number", "cycle_time", "run_time", "effective_axis_count", "total_machined_parts", "used_memory", "free_memory", "available_program_count", "registered_program_count", "machine_record_state") ``` 3. 将转换后的数据保存到`dwd.fact_machine_learning_data`中。 ```scala parsedData.write.mode("append").jdbc(url, "fact_machine_learning_data", connectionProperties) ``` 4. 使用CLI查询`dwd.fact_machine_learning_data`前1条数据。 ```sql SELECT * FROM dwd.fact_machine_learning_data ORDER BY machine_record_id ASC LIMIT 1; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

约定Da于配置

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

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

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

打赏作者

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

抵扣说明:

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

余额充值