2023年全國職業院校技能大賽中職組大數據應用與服務賽項題庫參考答案陸續更新中,敬請期待…
武漢唯眾智創科技有限公司
2024 年 2 月
聯系人:辜渝儐13037102709
題號:試題01
模塊二:數據獲取與處理
(一)任務一:數據獲取與清洗
1.子任務一:數據獲取
(1)啟動Hadoop集群,使用HDFS Shell指令,在HDFS根目錄下級聯創建一個名為/behavior/origin_log的目錄,用于存儲采集到的用戶行為日志;
答:hadoop fs -mkdir -p /behavior/origin_log
(2)目錄創建完成,使用HDFS Shell指令,將本地/root/eduhq/data/app_log/behavior目錄下的所有用戶行為日志文件采集至HDFS的/behavior/origin_log目錄下;
答:hadoop fs -put /root/eduhq/data/app_log/behavior/* /behavior/origin_log
(3)采集完成,在本機打開瀏覽器,訪問http://本機主機名:9870或http://本機IP地址:9870進入HDFS WebUI界面,查看是否成功將數據采集到HDFS上。
答:使用瀏覽器訪問即可。
2.子任務二:數據清洗
(1)使用Windows操作系統上的Excel軟件,打開名為
"behavior2023-01-01.csv"的文件;
(2)對數據進行清洗,專注處理名為"behavior2023- 01-01.csv"的文件中的"time"列。將時間日期格式進行分列,分別處理為日期和時間兩列。
答:
(二)任務二:數據標注
開 發 一 個 簡 單 的 Java 類 IpToLocUdf , 繼 承
org.apache.hadoop.hive.ql.udf.generic.GenericUDF ,重載initialize()、evaluate()和 getDisplayString()方法;該類需要實現通過 IP 從/root/eduhq/data/area.json文件中隨機獲取“省份”和“城市”信息,完成數據的分類標注。
答:
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ObjectNode;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class IpToLocUdf extends GenericUDF {private StringObjectInspector stringInspector;private ObjectInspector outputOI;// 初始化函數,用于設置函數參數和輸出類型/*這個initialize方法的主要作用是驗證輸入參數的數量和類型,并設置輸出類型為字符串。如果輸入參數不符合要求,它將拋出異常。最后,它返回一個輸出類型的ObjectInspector,供其他方法使用。*/@Overridepublic ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {// 檢查參數數量是否為1,如果不是則拋出異常if (arguments.length != 1) {throw new UDFArgumentLengthException("The function iptoloc(ip) takes exactly 1 argument.");}// 檢查第一個參數是否為StringObjectInspector類型,如果不是則拋出異常if (!(arguments[0] instanceof StringObjectInspector)) {throw new UDFArgumentTypeException(0,"The argument must be a string, but " + arguments[0].getTypeName()+ " was given.");}// 將第一個參數設置為字符串類型的ObjectInspectorthis.stringInspector = (StringObjectInspector) arguments[0];// 設置輸出類型為字符串,通過反射創建ObjectInspector實例this.outputOI = ObjectInspectorFactory.getReflectionObjectInspector(String.class,ObjectInspectorFactory.ObjectInspectorOptions.JAVA);// 打印輸出類型的ObjectInspector信息System.out.println(outputOI);return outputOI; // 返回輸出類型的ObjectInspector,供其他方法使用}@Overridepublic Object evaluate(DeferredObject[] arguments) throws HiveException {// 獲取傳入的IP地址參數String ip = stringInspector.getPrimitiveJavaObject(arguments[0].get());// 從指定文件中讀取地區信息//File file = new File("/root/eduhq/data/area.json");File file = new File("/resources/area.json");ObjectMapper mapper = new ObjectMapper();List<String> provinces = new ArrayList<>();List<String> cities = new ArrayList<>();try {// 解析JSON文件JsonNode rootNode = mapper.readTree(file);// 遍歷JSON節點,獲取省份和城市信息for (JsonNode node : rootNode) {String province = node.path("province").getTextValue();String city = node.path("city").getTextValue();provinces.add(province);cities.add(city);}} catch (IOException e) {throw new HiveException("Failed to read area.json file: " + e.getMessage(), e);}// 根據IP地址進行分類標注int index = ipToIndex(ip);String province = provinces.get(index);String city = cities.get(index);// 返回分類標注結果ObjectNode result = mapper.createObjectNode();result.put("province", province);result.put("city", city);return result.toString();}@Overridepublic String getDisplayString(String[] children) {return "iptoloc(" + children[0] + ")";}private int ipToIndex(String ip) {// 根據IP地址的某種算法得到索引值// 這里簡單地使用IP地址的字符長度模擬算法return ip.length() % 7;}
}
<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.2</version></dependency>
(三)任務三:數據統計
1.子任務一:HDFS 文件上傳下載
( 1 ) 將包“ com.hive.udf ”導出為名為 hive-udf- behavior-1.0.0.jar 的 JAR 文件, 并 保 存在 本地 的
/root/eduhq/udf_jars 目錄中;
答:https://blog.csdn.net/gb4215287/article/details/132793531
(2)將打包文件 hive-udf-behavior-1.0.0.jar 上傳到HDFS 的/hive/udf_jars 目錄下;
答:hadoop fs -put hive-udf-behavior-1.0.0.jar /hive/udf_jars
(3)在 Hive 客戶端,創建永久函數 url_trans 和get_city_by_ip,并將它們與開發好的 class 相關聯;
答:
add jar /root/eduhq/udf_jars/hive-udf-behavior-1.0.0.jar
create function url_trans as com.hive.udf.url_trans;
create function get_city_by_ip as com.hive.udf.get_city_by_ip;
(4)在 Hive 客戶端,使用 select 語句測試url_trans和get_city_by_ip 函數;
**答:**根據具體作用使用。例如:
select get_city_by_ip(ip);
(5)啟動 Hive 的動態分區功能,并將 Hive 設置為非嚴格模式;
答:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrict;
(6)使用 insert overwrite … select …子句將ods_behavior_log 表中數據插入分區表 dwd_behavior_log中,并實現根據 dt 進行動態分區。
答:insert overwrite table dwd_behavior_log PARTITION (dt) select *,date_format(dt,'yyyy-MM-dd') from ods_behavior_log;
2.子任務二:數據統計
(1)查看dwd_behavior_log表的所有現有分區;
答:SHOW PARTITIONS dwd_behavior_log;
(2)查看外部表dwd_behavior_log的前3行數據,并驗證URL協議是否被統一為“http”,以及通過IP是否能夠獲取到“省份”和“城市”信息;
答:
SELECT * FROM dwd_behavior_log LIMIT 3;
SELECT URL FROM dwd_behavior_log WHERE URL LIKE 'http://%';
返回所有以“http://”開頭的URL。如果返回的行數大于0,則說明URL協議被統一為“http”。
通過ip獲取省份,例如:select get_city_by_ip(ip);
(3)統計外部表dwd_behavior_log數據總行數。
答:SELECT COUNT(*) FROM dwd_behavior_log;
更多內容請聯系
武漢唯眾智創科技有限公司
欲了解更多信息,歡迎登錄www.whwzzc.com,咨詢電話13037102709
*本資料產品圖片及技術數據僅供參考,如有更新恕不另行通知,具體內容解釋權歸唯眾所有。