大数据之指标计算(8) -- 使用Spark根据dwd层fact_change_record表展示每一个设备最近第二次的状态(倒数第二次),...返回结果存入clickhouse数据库
这是一个关于使用Scala和Spark展示每一个设备最近第二次状态并将结果存储在clickhouse数据库中,然后在Linux命令行工具中查询前五条设备id倒序排列的数据的问题。下面是具体的要求和表结构:在dwd层fact_change_record表中,统计每一个设备最近第二次的状态(倒数第二次),时间字段选择change_start_time,如果设备仅有一种状态,返回该状态(一个设备不会同时
目录
前言
本题来源于全国职业技能大赛之大数据技术赛项工业数据处理赛题 - 离线数据处理 - 指标计算
注:由于个人设备问题,代码执行结果以及最后数据显示结果将不会给出。
题目:
提示:以下是本篇文章正文内容,下面案例可供参考(使用Scala语言编写)
一、读题分析
涉及组件:Scala,spark,hive,clickhouse
涉及知识点:
- 很熟悉的东西了
二、处理过程
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.{col, from_unixtime, row_number, unix_timestamp, when}
import java.util.Properties
object answer_No8 {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("MachineAvgProduceTime").master("local[*]").enableHiveSupport()
.getOrCreate()
val df = spark.read.table("dwd.fact_change_record").select("ChangeMachineID", "ChangeRecordState",
"ChangeStartTime", "ChangeEndTime").filter("ChangeEndTime is not null")
.withColumn("ChangeEndTime", from_unixtime(unix_timestamp(col("ChangeEndTime"), "yyyy-MM-dd HH:mm:ss")))
val windowSpec = Window.partitionBy("ChangeMachineID").orderBy(col("ChangeStartTime").desc)
val frame = df.withColumn("rn", row_number().over(windowSpec)).filter(col("rn") <= 2)
.withColumnRenamed("ChangeMachineID","machine_id")
.withColumnRenamed("ChangeRecordState","record_state")
.withColumnRenamed("ChangeStartTime","change_start_time")
.withColumnRenamed("ChangeEndTime","change_end_time")
.where(col("rn")===2).drop(col("rn"))
/*
frame.createOrReplaceTempView("temp")
spark.sql(
"""
|SELECT machine_id,
| record_state,
| change_start_time,
| change_end_time,
| CASE
| WHEN rn = '2' THEN (select rn from temp where rn=2)
| ELSE (select rn from temp where rn=1)
|FROM temp;
|
|
|""".stripMargin).show()*/
// frame.show()
sendToClickHouse(frame,"shtd_industry.recent_state","","root","")
spark.stop()
}
}
-- 代码仅供参考 --
关于sendToClickHouse函数怎么写,设备问题,在这里就不做展示了,可以参考我写的
大数据之指标计算(2) -- 使用Spark根据dwd层fact_change_record表关联dim_machine表统计每个车间中所有设备运行时长...将计算结果存入clickhouse数据库
三、重难点分析
这道题的难点主要在于综合运用不同技术栈进行数据处理和分析:
- 要掌握Spark的编程框架和API,能够对数据进行处理、分析和转换;
- 要了解Hive SQL和MySQL数据库,能够编写SQL查询语句,对数据进行聚合、统计和比较;
- 要熟悉clickhouse数据库,能够将处理后的数据写入clickhouse,并使用clickhouse命令行工具查询数据;
- 还需要熟悉Linux系统的命令行工具,能够在Linux系统中操作数据和执行程序。
除了技术难点,还需要注意数据的处理和分析过程中的细节和精度,例如脏数据的过滤、计算结果的精确性等。另外,在实际应用时还需要考虑数据的来源和质量,以及对应用产生的影响和安全等问题。
本期为指标计算第8篇,最终篇,关于本系列题目可在我发布的资源中工业数据处理训练中找到。
总结
这是一个关于使用Scala和Spark展示每一个设备最近第二次状态并将结果存储在clickhouse数据库中,然后在Linux命令行工具中查询前五条设备id倒序排列的数据的问题。下面是具体的要求和表结构:
- 在dwd层fact_change_record表中,统计每一个设备最近第二次的状态(倒数第二次),时间字段选择change_start_time,如果设备仅有一种状态,返回该状态(一个设备不会同时拥有两种状态),得到设备id(machine_id)、状态信息(record_state)、状态开始时间(change_start_time)和状态结束时间(change_end_time)字段。
- 将计算结果存储在clickhouse数据库shtd_store的表recent_state中,表结构包含machine_id、record_state、change_start_time和change_end_time字段。
- 通过Linux的clickhouse命令行工具查询出前5条设备id倒序排列的数据,将SQL语句和执行结果截图粘贴到报告中。
注意:这个题目需要掌握Spark编程、clickhouse数据库以及Linux命令行工具的使用。
请关注我的大数据技术专栏大数据技术 作者: Eternity.Arrebol
请关注我获取更多与大数据相关的文章Eternity.Arrebol的博客
Q-欢迎在评论区进行交流-Q
更多推荐
所有评论(0)