大数据之指标计算(4) -- 使用Spark根据dwd层dwd.fact_produce_record表,基于全量历史数据计算各设备生产一个产品的平均耗时,将结果存入clickhouse表中

文章介绍了如何使用Scala和Spark处理大数据,从dwd.fact_produce_record表中计算设备生产一个产品的平均耗时,排除脏数据,然后将高于平均值的数据存储到ClickHouse数据库。主要涉及的组件包括Scala、Spark、ClickHouse和Hive,同时也强调了Linux命令行工具在查询数据中的应用。
摘要由CSDN通过智能技术生成

目录

前言

题目:

一、读题分析

二、处理过程

三、重难点分析

总结 


前言

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

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

题目:


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

一、读题分析

涉及组件:Scala,Spark,clickhouse,hive

涉及知识点:

  1. 数据处理与计算
  2. clickhouse数据库的使用
  3. Hive中联合主键去重
  4. 剔除脏数据

二、处理过程

  -- 代码仅供参考 --


import org.apache.spark.sql.SparkSession

import java.util.Properties

object answer_No4 {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("MachineAvgProduceTime").master("local[*]")
      .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 *
        |from (
        |         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) t1
        |where producetime > produce_per_avgtime
        |
        |""".stripMargin)
    //    resultDF.show()

 
      sendToClickHouse(resultDF,"shtd_industry.machine_produce_per_avgtime","","root","")

  }
}

-- 代码仅供参考 -- 

关于sendToClickHouse函数怎么写,设备问题,在这里就不做展示了,可以参考我写的大数据之指标计算(2) -- 使用Spark根据dwd层fact_change_record表关联dim_machine表统计每个车间中所有设备运行时长...将计算结果存入clickhouse数据库


三、重难点分析

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

类似,只是存入的数据库发生了改变。

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


总结 

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

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

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

本篇是作者的大数据之指标计算系列之一:

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

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

大数据处理场景中,Spark一个常用的大规模数据处理框架,它支持实时流处理和批处理任务。如果你需要基于DWD(描述性维度建模)的数据(通常是结构化数据),通过Spark进行处理,一般可以按照以下步骤进行: 1. **数据读取**:首先使用Spark SQL或者DataFrame API从Hadoop HDFS、Hive metastore或其他数据源(如CSV、Parquet等)加载DWD数据。 ```python from pyspark.sql import SparkSession # 创建SparkSession spark = SparkSession.builder.appName("DWD Data Processing").getOrCreate() # 读取DWD数据 df_dwd = spark.read.format("parquet") \ .option("path", "hdfs://your-dwd-path") \ .load() ``` 2. **数据清洗和预处理**:对数据进行去重、填充缺失值、转换格式等操作,可能需要用到ForeachWriter或udf(用户定义函数)。 ```python import pyspark.sql.functions as F # 数据清洗示例 cleaned_df = df_dwd.drop_duplicates() \ .withColumn("column_to_fill", F.when(df["column"].isNull(), "default_value").otherwise(df["column"])) ``` 3. **计算分析**:执行复杂的聚合操作,例如分组统计、窗口函数,甚至机器学习模型训练。 ```python aggregated_results = cleaned_df.groupBy("group_column") \ .agg(F.avg("value_column"), F.count("*")) ``` 4. **将结果写入MySQL**:Spark提供`jdbc`库来连接并保存结果到关系数据库,如MySQL。 ```python from pyspark.sql import JDBCWriter url = "jdbc:mysql://localhost:3306/your_database" table_name = "results_table" jdbccfg = { "driver": "com.mysql.cj.jdbc.Driver", "url": url, "dbtable": table_name, "user": "username", "password": "password" } writer = JDBCWriter(options=jdbccfg) writer.write dataframe=aggregated_results writer.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

约定Da于配置

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

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

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

打赏作者

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

抵扣说明:

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

余额充值