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

这篇具有很好参考价值的文章主要介绍了全国职业院校技能大赛-大数据 离线数据处理模块-指标计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

赛题来源2023年全国职业院校技能大赛赛题第1套任务B中指标计算模块

子任务三:指标计算

编写Scala代码,使用Spark计算相关指标。

注:在指标计算中,不考虑订单信息表中order_status字段的值,将所有订单视为有效订单。计算订单金额或订单总金额时只使用final_total_amount字段。需注意dwd所有的维表取最新的分区。

 第一题

根据dwd层表统计每个省份、每个地区、每个月下单的数量和下单的总金额,存入MySQL数据库shtd_result的provinceeverymonth表中(表结构如下),然后在Linux的MySQL命令行中根据订单总数、订单总金额、省份表主键均为降序排序,查询出前5条,将SQL语句复制粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下,将执行结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下

字段

类型

中文含义

备注

provinceid

int

省份表主键

provincename

text

省份名称

regionid

int

地区表主键

regionname

text

地区名称

totalconsumption

double

订单总金额

当月订单总金额

totalorder

int

订单总数

当月订单总数

year

int

订单产生的年

month

int

订单产生的月

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

object Compute01 {
  def main(args: Array[String]): Unit = {
    System.setProperty("HADOOP_USER_NAME", "atguigu")

    // TODO 创建spark连接
    val conf = new SparkConf().setMaster("local[*]").setAppName("Compute01")
    val spark: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()

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

    // TODO 执行核心查询SQL
    val result = spark.sql(
      """
        |select
        |    province.id provinceid,
        |    province.name provincename,
        |    region.id regionid,
        |    region.region_name regionname,
        |    sum(final_total_amount)
        |       over(partition by province.id,region.id,year(od.create_time),month(od.create_time)) totalconsumption,
        |    count(od.id)
        |       over(partition by province.id,region.id,year(od.create_time),month(od.create_time)) totalorder,
        |    year(od.create_time) year,
        |    month(od.create_time) month
        |from (
        |     select
        |        id,
        |        province_id,
        |        final_total_amount,
        |        trade_body,
        |        create_time
        |     from dwd.act_order_info
        |) od
        |left join (
        |    select
        |        id,
        |        name,
        |        region_id
        |    from ods.dim_province
        |    where etl_date = (
        |        select max(etl_date)
        |        from ods.dim_province
        |    )
        |) province on od.province_id = province.id
        |left join (
        |    select
        |        id,
        |        region_name
        |    from dwd.dim_region
        |    where etl_date = (
        |       select max(etl_date)
        |       from ods.dim_province
        |    )
        |) region on province.region_id = region.id
        |""".stripMargin)

    // 查看结果
    result.show()

    // TODO 结果保存到指定的表中
    result.write
      .format("jdbc") // 使用jdbc格式写入带mysql
      .mode(SaveMode.Append) // 保存方式为追加
      .option("Driver", "com.mysql.jdbc.Driver")
      .option("url", "jdbc:mysql://shtd_result")
      .option("user", "root")
      .option("password", "000000")
      .option("dbtable", "provinceeverymonth")
      .save()
    // shtd_result.provinceeverymonth
    // TODO 关闭spark连接
    spark.close()
  }
}

结果查询SQL

-- 订单总数
select
    *
from dwd.shtd_result.provinceeverymonth
order by totalorder desc
limit 5;
-- 订单总金额
select
    *
from dwd.shtd_result.provinceeverymonth
order by totalconsumption desc
limit 5;
-- 省份表主键
select
    *
from dwd.shtd_result.provinceeverymonth
order by provinceid desc
limit 5;

第二题

请根据dwd层表计算出2020年4月每个省份的平均订单金额和所有省份平均订单金额相比较结果(“高/低/相同”),存入MySQL数据库shtd_result的provinceavgcmp表(表结构如下)中,然后在Linux的MySQL命令行中根据省份表主键、该省平均订单金额均为降序排序,查询出前5条,将SQL语句复制粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下,将执行结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下

字段

类型

中文含义

备注

provinceid

int

省份表主键

provincename

text

省份名称

provinceavgconsumption

double

该省平均订单金额

allprovinceavgconsumption

double

所有省平均订单金额

comparison

text

比较结果

该省平均订单金额和所有省平均订单金额比较结果,值为:高/低/相同

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

object Compute02 {
  def main(args: Array[String]): Unit = {
    System.setProperty("HADOOP_USER_NAME", "atguigu")

    val conf = new SparkConf().setMaster("local[*]").setAppName("Compute02")
    val spark: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()

    spark.conf.set("hive.exec.dynamic.partition.mode", "nonstrict")
    spark.sparkContext.setLogLevel("OFF")

    val result = spark.sql(
      """
        |select
        |    provinceid,
        |    provincename,
        |    provinceavgconsumption,
        |    allprovinceavgconsumption,
        |    case
        |        when provinceavgconsumption > allprovinceavgconsumption then '高'
        |        when provinceavgconsumption < allprovinceavgconsumption then '低'
        |        else '相同'
        |    end comparison -- 比较结果
        |from
        |(
        |    select
        |        id provinceid,
        |        name provincename
        |    from dwd.dim_province
        |    where etl_date = (
        |        select max(etl_date) from ods.base_province
        |    )
        |) province
        |left join (
        |    select
        |        province_id,
        |        avg(final_total_amount) provinceavgconsumption -- 该省平均订单金额
        |    from ods.order_info
        |    where create_time between '2020-04-01' and '2020-04-30'
        |    group by dwd.act_order_info
        |) od on od.province_id = province.provinceid
        |left join (
        |    select
        |        province_id,
        |        avg(final_total_amount) allprovinceavgconsumption -- 所有省平均订单金额
        |    from dwd.act_order_info
        |    where create_time between '2020-06-01' and '2022-06-30'
        |) avgorder on avgorder.province_id = province.provinceid
        |""".stripMargin)

    result
      .write
      .format("jdbc")
      .mode(SaveMode.Append)
      .option("Driver", "com.mysql.jdbc.Driver")
      .option("url", "jdbc:mysql://shtd_result")
      .option("user", "root")
      .option("password", "000000")
      .option("dbtable", "provinceavgcmp")
      .save()

    spark.close()
  }
}

结果查询SQL

-- 省份表主键
select *
from shtd_result.provinceavgcmp
order by provinceid desc
limit 5;
-- 该省平均订单金额
select
    *
from shtd_result.provinceavgcmp
order by provinceavgconsumption desc
limit 5;

第三题

根据dwd层表统计在两天内连续下单并且下单金额保持增长的用户,存入MySQL数据库shtd_result的usercontinueorder表(表结构如下)中,然后在Linux的MySQL命令行中根据订单总数、订单总金额、客户主键均为降序排序,查询出前5条,将SQL语句复制粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下,将执行结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下

字段

类型

中文含义

备注

userid

int

客户主键

username

text

客户名称

day

text

记录下单日的时间,格式为

yyyyMMdd_yyyyMMdd

例如: 20220101_20220102

totalconsumption

double

订单总金额

连续两天的订单总金额

totalorder

int

订单总数

连续两天的订单总数

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

object Compute03 {
  def main(args: Array[String]): Unit = {
    System.setProperty("HADOOP_USER_NAME", "atguigu")

    val conf = new SparkConf().setMaster("local[*]").setAppName("Compute03")
    val spark: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()

    spark.conf.set("hive.exec.dynamic.partition.mode", "nonstrict")
    spark.sparkContext.setLogLevel("OFF")

    val result = spark.sql(
      """
        | select
        |     userid,
        |     username,
        |     buy_date_first,
        |     buy_date_second,
        |     concat(buy_date_first, '_', buy_date_second) day,
        |     totalconsumption,
        |     totalorder
        | from (
        |     select
        |      od1.user_id userid,
        |      od2.consignee username,
        |      buy_date_first,
        |      buy_date_second,
        |      totalconsumption,
        |      od1.totalorder,
        |      datediff(buy_date_second, buy_date_first) part_date_num,
        |      if (buy_amount_second - total_amount > 0, 1, 0) part_amount_increase
        |     from (
        |         select
        |             user_id ,
        |             create_time buy_date_first, -- 获取当前时间的下一天
        |             count(id) totalorder,
        |             lead(create_time, 1, "9999-12-31 00:00:00") over (partition by user_id order by create_time) buy_date_second,
        |             lead(final_total_amount) over(partition by user_id order by create_time) buy_amount_second,
        |             sum(total_amount) over (partition by user_id) totalconsumption
        |         from dwd.act_order_info
        |         group by user_id, date_format(create_time, 'yyyyMMdd')
        |     ) od1
        |     left join (
        |     select
        |         user_id,
        |         consignee,
        |         final_total_amount
        |     from dwd.act_order_info
        |     ) od2 on od1.user_id = od2.user_id
        | )
        | where part_date_num = 1        -- 连续两天的订单
        | and part_amount_increase = 1   -- 订单金额保持增长
        |""".stripMargin)

    result
      .write
      .format("jdbc")
      .mode(SaveMode.Append)
      .option("Driver", "com.mysql.jdbc.Driver")
      .option("url", "jdbc:mysql://shtd_result")
      .option("user", "root")
      .option("password", "000000")
      .option("dbtable", "provinceavgcmp")
      .save()

    spark.close()
  }
}

结果查询sql

-- 订单总数
select
    *
from shtd_result.usercontinueorder
order by totalorder desc
limit 5;
-- 订单总金额
select
    *
from shtd_result.usercontinueorder
order by totalconsumption
limit 5;
-- 客户主键
select
    *
from shtd_result.usercontinueorder
order by userid desc
limit 5;

指标计算部分的难点就是多表查询的部分已经开窗函数的合理运用,因此熟练掌握HiveSQL中高级函数的部分是非常重要的,不然此部分将会很难完成文章来源地址https://www.toymoban.com/news/detail-791431.html

到了这里,关于全国职业院校技能大赛-大数据 离线数据处理模块-指标计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2022全国职业院校技能大赛软件测试赛项解析

    随着时间的流逝,2022的赛项规程和赛项赛题也在3月24号全部官网发布了,看了下其他的赛项赛项组委会今年改革真的狠要求每个赛项公布十套题,看着软测赛项又有无力吐槽点都是看到第一眼都是懵的(公布的试题练习只有软测每次都是这样,自己去赛项规程和赛项试题去寻

    2023年04月09日
    浏览(49)
  • 2023年全国职业院校技能大赛-信息安全管理与评估-赛题 1

    目录 信息安全管理与评估 赛题一 模块一 网络平台搭建与设备安全防护 任务1:网络平台搭建 (50分) 任务2:网络安全设备配置与防护(250分) 模块二 网络安全事件响应、数字取证调查、应用程序安全 竞赛项目赛题 介绍 所需的设备、机械、装置和材料 评分方案 项目和任

    2024年02月06日
    浏览(50)
  • 2022 年全国职业院校技能大赛高职组云计算赛项试卷-容器云-1

    2022 年全国职业院校技能大赛高职组云计算赛项试卷 ........ 【任务 1 】容器云平台搭建[5 分] 【适用平台】私有云 【题目 1】平台部署--部署容器云平台[1.5 分] 登录 OpenStack 私有云平台,使用 CentOS7.9 镜像创建两台云主机,使用 kubeeasy 工具完成 Kubernetes 1.22.1 集群的搭建。然后

    2024年02月12日
    浏览(48)
  • 2023年全国职业院校技能大赛网络建设与运维样题理论题答案

                                                                      禁止侵权,禁止转载                                                         1.贵公司正在评估数据中心虚拟化技术,要求您解释第1类和第2类虚拟化管理程序之间的区别。以下哪项是第1类虚拟

    2024年02月07日
    浏览(56)
  • 2023年全国职业院校技能大赛-高职组-物联网应用开发-任务书(第6套卷)

    目录 第一部分 竞赛须知 一、竞赛要求 二、职业素养与安全意识 三、扣分项 四、选手须知 第二部分 竞赛设备及注意事项 一、注意事项 二、硬件环境 第三部分竞赛任务 模块一 物联网方案设计与升级改造(40分) 子任务1-1 感知层设备安装与调试 1、设备选型、布局与安装连

    2024年02月08日
    浏览(57)
  • 教育部办公厅关于印发《全国职业院校技能大赛执行规划(2023—2027年)》的通知

    全国职业院校技能大赛执行规划 (2023—2027年) 完善选手奖励政策。探索建立和完善分层分级的大赛获奖师生奖励制度。鼓励各地协调联合主办单位,借鉴相关做法,在授予技术能手、青年岗位能手称号和职业技能等级评定等方面出台相关办法和举措;完善大赛获奖选手在升

    2024年02月01日
    浏览(40)
  • 2023年全国职业院校技能大赛-高职组-物联网应用开发-任务书(第1套卷)

    目录 第一部分 竞赛须知 一、竞赛要求 二、职业素养与安全意识 三、扣分项 四、选手须知 第二部分 竞赛设备及注意事项 一、注意事项 二、硬件环境 第三部分竞赛任务 模块一 物联网方案设计与升级改造(40分) 模块二 物联网应用开发与调试(60分) 1、正确使用工具,

    2024年02月08日
    浏览(58)
  • 2023年全国职业院校技能大赛信息安全管理与评估网络安全渗透任务书

    全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块三 网络安全渗透、理论技能与职业素养 比赛时间及注意事项 本阶段比赛时长为180分钟,时间为 9:00-12:00。 【注意事项】 (1)通过找到正确的flag值来获取得分,flag统一格式如下所示: flag{flag值 } 这种

    2024年02月10日
    浏览(48)
  • 全国职业院校技能大赛-嵌入式系统应用开发赛项-竞赛任务书(第5套)

    目录 全国职业院校技能大赛嵌入式系统应用开发赛项 竞赛模块: 模块一 竞赛注意事项 第一模块 嵌入式系统硬件制作与驱动开发 竞赛任务书(第5套) 一、总体要求 二、竞赛任务表 竞赛模块: 模块二 竞赛注意事项 第二模块 嵌入式系统应用程序开发 竞赛任务书(第5套)

    2024年02月04日
    浏览(55)
  • 全国职业院校技能大赛-嵌入式系统应用开发赛项-竞赛任务书(第9套)

    目录 全国职业院校技能大赛嵌入式系统应用开发赛项 竞赛模块: 模块一 竞赛注意事项 第一模块 嵌入式系统硬件制作与驱动开发 竞赛任务书(第9套) 一、总体要求 二、竞赛任务表 竞赛模块: 模块二 竞赛注意事项 第二模块 嵌入式系统应用程序开发 竞赛任务书(第9套)

    2024年02月07日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包