子任务一:数据抽取
编写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,