電商數(shù)據(jù)處理訓(xùn)練任務(wù)
? ? 說明:此文章主要為(任務(wù)一)數(shù)據(jù)抽取、(任務(wù)二)數(shù)據(jù)清洗及(任務(wù)三)指標(biāo)計算前五題,為另一文章“電商數(shù)據(jù)處理_指標(biāo)計算”的優(yōu)化(后面五題懶得寫),簡潔度及性能有較大的提高。Spark版本為3.1.1,Hadoop版本為3.1.3,Scala版本為2.12,Hive版本為3.1.2。

任務(wù)一:數(shù)據(jù)抽取
使用Scala編寫spark工程代碼,將MySQL的ds_db01庫中表customer_inf、customer_inf、order_detail、order_master、product_info的數(shù)據(jù)增量抽取到Hive的ods庫(需自建)中對應(yīng)表customer_inf、order_detail、order_master、product_info中。(for循環(huán)秒了)
1、 抽取ds_db01庫中customer_inf的增量數(shù)據(jù)進入Hive的ods庫中表customer_inf。根據(jù)ods.user_info表中modified_time作為增量字段,只將新增的數(shù)據(jù)抽入,字段名稱、類型不變,同時添加靜態(tài)分區(qū),分區(qū)字段為etl_date,類型為String,且值為當(dāng)前日期的前一天日期(分區(qū)字段格式為yyyyMMdd)。使用hive cli執(zhí)行show partitions ods.customer_inf命令;
2、 抽取ds_db01庫中product_info的增量數(shù)據(jù)進入Hive的ods庫中表product_info。根據(jù)ods.product_info表中modified_time作為增量字段,只將新增的數(shù)據(jù)抽入,字段名稱、類型不變,同時添加靜態(tài)分區(qū),分區(qū)字段為etl_date,類型為String,且值為當(dāng)前日期的前一天日期(分區(qū)字段格式為yyyyMMdd)。使用hive cli執(zhí)行show partitions ods.product_info命令;
3、 抽取ds_db01庫中order_master的增量數(shù)據(jù)進入Hive的ods庫中表order_master,根據(jù)ods.order_master表中modified_time作為增量字段,只將新增的數(shù)據(jù)抽入,字段名稱、類型不變,同時添加靜態(tài)分區(qū),分區(qū)字段為etl_date,類型為String,且值為當(dāng)前日期的前一天日期(分區(qū)字段格式為yyyyMMdd)。使用hive cli執(zhí)行show partitions ods.order_master命令;
4、 抽取ds_db01庫中order_detail的增量數(shù)據(jù)進入Hive的ods庫中表order_detail,根據(jù)ods.order_detail表中modified_time作為增量字段,只將新增的數(shù)據(jù)抽入,字段名稱、類型不變,同時添加靜態(tài)分區(qū),分區(qū)字段為etl_date,類型為String,且值為當(dāng)前比賽日的前一天日期(分區(qū)字段格式為yyyyMMdd)。使用hive cli執(zhí)行show partitions ods.order_detail命令。
任務(wù)二:數(shù)據(jù)清洗
編寫Hive SQL或者Spark Sql代碼,將ods庫中相應(yīng)表數(shù)據(jù)(經(jīng)過數(shù)據(jù)抽取得數(shù)據(jù))抽取到Hive的dwd庫中對應(yīng)表中。表中有涉及到timestamp類型的,均要求按照yyyy-MM-dd HH:mm:ss,不記錄毫秒數(shù),若與日期有關(guān)的數(shù)據(jù),必須轉(zhuǎn)為timestamp,若原數(shù)據(jù)中只有年月日,則在時分秒的位置添加00:00:00,添加之后使其符合yyyy-MM-dd HH:mm:ss。
1、 抽取ods庫中customer_inf表中昨天的分區(qū)(任務(wù)一生成的分區(qū))數(shù)據(jù),并結(jié)合dim_customer_inf最新分區(qū)現(xiàn)有的數(shù)據(jù),根據(jù)customer_id合并數(shù)據(jù)到dwd庫中dim_customer_inf的分區(qū)表(合并是指對dwd層數(shù)據(jù)進行插入或修改,需修改的數(shù)據(jù)以customer_id為合并字段,根據(jù)modified_time排序取最新的一條),分區(qū)字段為etl_date且值與ods庫的相對應(yīng)表該值相等,并添加dwd_insert_user、dwd_insert_time、dwd_modify_user、dwd_modify_time四列,其中dwd_insert_user、dwd_modify_user均填寫“user1”。若該條記錄第一次進入數(shù)倉dwd層則dwd_insert_time、dwd_modify_time均存當(dāng)前操作時間,并進行數(shù)據(jù)類型轉(zhuǎn)換。若該數(shù)據(jù)在進入dwd層時發(fā)生了合并修改,則dwd_insert_time時間不變,dwd_modify_time存當(dāng)前操作時間,其余列存最新的值。使用hive cli執(zhí)行show partitions dwd.dim_customer_inf命令;屎山代碼(不是)
2、 抽取ods庫中product_info表中昨天的分區(qū)(任務(wù)一生成的分區(qū))數(shù)據(jù),并結(jié)合dim_product_info最新分區(qū)現(xiàn)有的數(shù)據(jù),根據(jù)product_id合并數(shù)據(jù)到dwd庫中dim_product_info的分區(qū)表(合并是指對dwd層數(shù)據(jù)進行插入或修改,需修改的數(shù)據(jù)以product_id為合并字段,根據(jù)modified_time排序取最新的一條),分區(qū)字段為etl_date且值與ods庫的相對應(yīng)表該值相等,并添加dwd_insert_user、dwd_insert_time、dwd_modify_user、dwd_modify_time四列,其中dwd_insert_user、dwd_modify_user均填寫“user1”。若該條記錄第一次進入數(shù)倉dwd層則dwd_insert_time、dwd_modify_time均存當(dāng)前操作時間,并進行數(shù)據(jù)類型轉(zhuǎn)換。若該數(shù)據(jù)在進入dwd層時發(fā)生了合并修改,則dwd_insert_time時間不變,dwd_modify_time存當(dāng)前操作時間,其余列存最新的值。使用hive cli執(zhí)行show partitions dwd.dim_product_info命令;
3、 將ods庫中order_master表昨天的分區(qū)(任務(wù)一生成的分區(qū))數(shù)據(jù)抽取到dwd庫中fact_order_master的動態(tài)分區(qū)表,分區(qū)字段為etl_date,類型為String,取create_time值并將格式轉(zhuǎn)換為yyyyMMdd,并添加dwd_insert_user、dwd_insert_time、dwd_modify_user、dwd_modify_time四列,其中dwd_insert_user、dwd_modify_user均填寫“user1”,dwd_insert_time、dwd_modify_time均填寫當(dāng)前操作時間,并進行數(shù)據(jù)類型轉(zhuǎn)換,需要過濾掉city字段長度大于8。使用hive cli執(zhí)行show partitions dwd.fact_order_master命令;
4、 將ods庫中order_detail表昨天的分區(qū)(任務(wù)一生成的分區(qū))數(shù)據(jù)抽取到dwd庫中fact_order_detail的動態(tài)分區(qū)表,分區(qū)字段為etl_date,類型為String,取create_time值并將格式轉(zhuǎn)換為yyyyMMdd,并添加dwd_insert_user、dwd_insert_time、dwd_modify_user、dwd_modify_time四列,其中dwd_insert_user、dwd_modify_user均填寫“user1”,dwd_insert_time、dwd_modify_time均填寫當(dāng)前操作時間,并進行數(shù)據(jù)類型轉(zhuǎn)換。使用hive cli執(zhí)行show partitions dwd.fact_order_detail命令;
任務(wù)三:指標(biāo)計算
注:與訂單金額計算相關(guān)使用order_money字段,同一個訂單無需多次重復(fù)計算,需要考慮退款或者取消的訂單
?
1、 根據(jù)dwd或者dws層表統(tǒng)計每人每天下單的數(shù)量和下單的總金額,存入dws層(需自建)的user_consumption_day_aggr表中(表結(jié)構(gòu)如下),然后使用hive cli按照客戶主鍵、訂單總金額均為降序排序,查詢出前5條;

2、 根據(jù)dwd或者dws層表統(tǒng)計每個城市每月下單的數(shù)量和下單的總金額(以order_master中的地址為判斷依據(jù)),并按照province_name,year,month進行分組,按照total_amount逆序排序,形成sequence值,將計算結(jié)果存入Hive的dws數(shù)據(jù)庫city_consumption_day_aggr表中(表結(jié)構(gòu)如下),然后使用hive cli根據(jù)訂單總數(shù)、訂單總金額均為降序排序,查詢出前5條,在查詢時對于訂單總金額字段將其轉(zhuǎn)為bigint類型(避免用科學(xué)計數(shù)法展示);

3、 請根據(jù)dwd或者dws層表計算出每個城市每個月平均訂單金額和該城市所在省份平均訂單金額相比較結(jié)果(“高/低/相同”),存入ClickHouse數(shù)據(jù)庫shtd_result的cityavgcmpprovince表中(表結(jié)構(gòu)如下),然后在Linux的ClickHouse命令行中根據(jù)城市平均訂單金額、省份平均訂單金額均為降序排序,查詢出前5條;

4、請根據(jù)dwd或者dws層表計算出每個城市每個月平均訂單金額和該城市所在省份訂單金額中位數(shù)相比較結(jié)果(“高/低/相同”),存入ClickHouse數(shù)據(jù)庫shtd_result的citymidcmpprovince表中(表結(jié)構(gòu)如下),然后在Linux的ClickHouse命令行中根據(jù)城市平均訂單金額、省份平均訂單金額均為降序排序,查詢出前5條;

5、請根據(jù)dwd或者dws層表來計算每個省份2022年訂單金額前3省份,依次存入ClickHouse數(shù)據(jù)庫shtd_result的regiontopthree表中(表結(jié)構(gòu)如下),然后在Linux的ClickHouse命令行中根據(jù)省份升序排序,查詢出前5條;

