全国职业院校技能大赛-大数据应用赛项-离线数据处理-01

子任务一:数据抽取
编写Scala代码,使用Spark将MySQL的shtd_store库中表user_info、sku_info、base_province、base_region、order_info、order_detail的数据增量抽取到Hive的ods库中对应表user_info、sku_info、base_province、base_region、order_info、order_detail中。(若ods库中部分表没有数据,正常抽取即可) 
1、抽取shtd_store库中user_info的增量数据进入Hive的ods库中表user_info。根据ods.user_info表中operate_time或create_time作为增量字段(即MySQL中每条数据取这两个时间中较大的那个时间作为增量字段去和ods里的这两个字段中较大的时间进行比较),只将新增的数据抽入,字段名称、类型不变,同时添加静态分区,分区字段为etl_date,类型为String,且值为当前比赛日的前一天日期(分区字段格式为yyyyMMdd)。使用hive cli执行show partitions ods.user_info命令,将结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;

def main(args: Array[String]): Unit = {
 val spark: SparkSession = sparkSessionUtils.getSession
 import spark.implicits._

 val maxOdsTime: String = spark.sql("select max(case when 'operate_time' > 'create_time' then operate_time else  create_time end) re from ods.user_info")
   .map((_: Row)(0).toString).collect()(0)

 mysqlUtils.read(spark, "ds_db01", "user_info")
   .withColumn("maxTime", when(
     col("operate_time") > col("create_time"), col("operate_time")
   ).otherwise(
     col("create_time")
   ))
   .where(col("maxTime") > maxOdsTime)
   .withColumn("etldate", lit("20230510"))
   .drop("maxTime")
   .write
   .mode(saveMode = SaveMode.Append)
   .saveAsTable("user_info")

 sparkSessionUtils.close(spark)

}


2、抽取shtd_store库中sku_info的增量数据进入Hive的ods库中表sku_info。根据ods.sku_info表中create_time作为增量字段,只将新增的数据抽入,字段名称、类型不变,同时添加静态分区,分区字段为etl_date,类型为String,且值为当前比赛日的前一天日期(分区字段格式为yyyyMMdd)。使用hive cli执行show partitions ods.sku_info命令,将结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;

def main(args: Array[String]): Unit = {
 val spark = sparkSessionUtils.getSession
 import spark.implicits. _
 val ods_user_nfo: Dataset[Row] = spark
   .table("ods.user_info")
   .where(col("etldate") === "20230321")

 val dwd_user_info: Dataset[Row] = spark
   .table("dwd.dim_user_info")
   .where("etldate = (select max(etldate) from dwd.dim_user_info)")

 val merged_user_info: Dataset[Row] = ods_user_nfo.union(dwd_user_info)
   .withColumn("rowNumber",
     row_number()
       .over(Window.partitionBy("id").orderBy(desc("operate_time")))
   )
   .where(col("rowNumber") === 1)
   .drop("rowNumber")

 val user_info_with_operate_time: DataFrame = merged_user_info.withColumn("operate_time",
   when(col("operate_time").isNull, col("create_time")).otherwise(col("operate_time"))
 )

 val modify_timeFunction: UserDefinedFunction = spark
   .udf
   .register("modify_time", (id: Long) => {
     val modify_time: String = dwd_user_info.filter((r: Row) => {
       r.get(0).toString.toLong.equals(id)
     }).select("dwd_modify_time").first().get(0).toString
     modify_time
   })

 val ids: Array[Long] = dwd_user_info.select("id").map((_: Row) (0).toString.toLong).collect()

 val user_info_with_dwd_cols: DataFrame = user_info_with_operate_time
   .withColumn("dwd_insert_user", lit("user1"))
   .withColumn("dwd_modify_user", lit("user1"))
   .withColumn("dwd_insert_time",
     when(col("id").isin(ids: _*), modify_timeFunction(col("id")))
       .otherwise(date_format(current_timestamp(), "yyyy-MM-dd HH:mm:ss"))
   )
   .withColumn("dwd_modify_time",
     when(col("dwd_modify_time").isNull, date_format(current_timestamp(), "yyyy-MM-dd HH:mm:ss"))
       .otherwise(when(col("id").isin(ids: _*), date_format(current_timestamp(), "yyyy-MM-dd HH:mm:ss"))
         .otherwise(col("dwd_modify_time"))
       )
   )
 user_info_with_dwd_cols.write
   .mode("overwrite")
   .partitionBy("etldate")
   .saveAsTable("dwd.dim_user_info")
}


3、抽取shtd_store库中base_province的增量数据进入Hive的ods库中表base_province。根据ods.base_province表中id作为增量字段,只将新增的数据抽入,字段名称、类型不变并添加字段create_time取当前时间,同时添加静态分区,分区字段为etl_date,类型为String,且值为当前比赛日的前一天日期(分区字段格式为yyyyMMdd)。使用hive cli执行show partitions ods.base_province命令,将结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;

4、抽取shtd_store库中base_region的增量数据进入Hive的ods库中表base_region。根据ods.base_region表中id作为增量字段,只将新增的数据抽入,字段名称、类型不变并添加字段create_time取当前时间,同时添加静态分区,分区字段为etl_date,类型为String,且值为当前比赛日的前一天日期(分区字段格式为yyyyMMdd)。使用hive cli执行show partitions ods.base_region命令,将结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;

5、抽取shtd_store库中order_info的增量数据进入Hive的ods库中表order_info,根据ods.order_info表中operate_time或create_time作为增量字段(即MySQL中每条数据取这两个时间中较大的那个时间作为增量字段去和ods里的这两个字段中较大的时间进行比较),只将新增的数据抽入,字段名称、类型不变,同时添加静态分区,分区字段为etl_date,类型为String,且值为当前比赛日的前一天日期(分区字段格式为yyyyMMdd)。使用hive cli执行show partitions ods.order_info命令,将结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;

6、抽取shtd_store库中order_detail的增量数据进入Hive的ods库中表order_detail,根据ods.order_detail表中create_time作为增量字段,只将新增的数据抽入,字段名称、类型不变,同时添加静态分区,分区字段为etl_date,类型为String,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值