题号:试题01 模块2:数据采集与处理(一) 任务1:数据采集与清洗1、子任务1:数据采集
启动Hadoop集群,使用HDFS Shell命令在HDFS根目录下级联创建名为/behavior/origin_log的目录,用于存储收集的用户行为日志;答案:hadoop fs -mkdir -p /behavior/origin_log
目录创建完成。使用HDFS Shell命令将本地/root/eduhq/data/app_log/behavior目录下的所有用户行为日志文件收集到HDFS /behavior/origin_log目录下;答案:hadoop fs -put /root/eduhq /data/app_log/behavior/* /behavior/origin_log
采集完成后,在本机打开浏览器,访问http://本地主机名:9870或http://本地IP地址:9870进入HDFS WebUI界面,查看数据是否已成功采集到HDFS。答:使用浏览器访问即可。
2. 子任务2:数据清理
在Windows操作系统上使用Excel软件打开名为“behavior2023-01-01.csv”的文件;
清理数据并关注名为“behavior2023-01-01.csv”的文件中的“时间”列。将时间和日期格式分为两列:日期和时间。回答:
(2)任务二:数据标注开发:开发一个简单的Java类IpToLocUdf,继承
org.apache.hadoop.hive.ql.udf.generic.GenericUDF,重载了initialize()、evaluate()和getDisplayString()方法;该类需要通过IP实现从/root/eduhq/data/area.json文件中随机获取“省”和“城市”信息,完成数据的分类和标注。
答案:导入org.apache.hadoop.hive.ql.exec.UDFArgumentException;
导入org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
导入org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
导入org.apache.hadoop.hive.ql.metadata.HiveException;
导入org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
导入org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
导入org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
导入org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
导入org.codehaus.jackson.JsonNode;
导入org.codehaus.jackson.map.ObjectMapper;
导入org.codehaus.jackson.node.ObjectNode;
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
公共类IpToLocUdf 扩展GenericUDF {
私有StringObjectInspector stringInspector;
私有ObjectInspector 输出OI;
//初始化函数,用于设置函数参数和输出类型
/*
该初始化方法的主要作用是验证输入参数的数量和类型,并将输出类型设置为字符串。
如果输入的参数不符合要求,则会抛出异常。
最后,它返回一个输出类型的ObjectInspector 供其他方法使用。
*/
@覆盖
公共ObjectInspector 初始化(ObjectInspector []参数)抛出UDFArgumentException {
//检查参数个数是否为1,如果不是则抛出异常
if (arguments.length !=1) {
抛出新的UDFArgumentLengthException(
'函数iptoloc(ip) 只接受1 个参数。');
}
//检查第一个参数是否为StringObjectInspector类型,如果不是则抛出异常
if (!(arguments[0] StringObjectInspector 实例)) {
抛出新的UDFArgumentTypeException(0,
'参数必须是字符串,但是' + argument[0].getTypeName()
+ '已给出。');
}
//将第一个参数设置为字符串类型的ObjectInspector
this.stringInspector=(StringObjectInspector) 参数[0];
//设置输出类型为string,并通过反射创建ObjectInspector实例
this.outputOI=ObjectInspectorFactory.getReflectionObjectInspector(String.class,
ObjectInspectorFactory.ObjectInspectorOptions.JAVA);
//打印输出类型的ObjectInspector信息
System.out.println(outputOI);
返回输出OI; //返回输出类型的ObjectInspector以供其他方法使用
}
@覆盖
公共对象评估(DeferredObject []参数)抛出HiveException {
//获取传入的IP地址参数
String ip=stringInspector.getPrimitiveJavaObject(arguments[0].get());
//从指定文件中读取区域信息
//文件file=new File('/root/eduhq/data/area.json');
文件file=new File('/resources/area.json');
ObjectMapper 映射器=new ObjectMapper();
列出省份=new ArrayList();
列出城市=new ArrayList();
尝试{
//解析JSON文件
JsonNode rootNode=mapper.readTree(file);
//遍历JSON节点获取省市信息
for (JsonNode 节点: rootNode) {
String Province=node.path('province').getTextValue();
String city=node.path('city').getTextValue();
省份.add(省份);
城市.add(城市);
}
} catch (IOException e) {
throw new HiveException('无法读取area.json file:' + e.getMessage(), e);
}
//根据IP地址进行分类和标签
int 索引=ipToIndex(ip);
字符串省份=Provinces.get(index);
字符串城市=城市.get(索引);
//返回分类标注结果
ObjectNode结果=mapper.createObjectNode();
result.put('省份', 省份);
结果.put('城市', 城市);
返回结果.toString();
}
@覆盖
公共字符串getDisplayString(String[] 儿童) {
返回'iptoloc(' + Children[0] + ')';
}
私有int ipToIndex(字符串ip) {
//根据IP地址的某种算法得到索引值
//这里我们简单的使用IP地址的字符长度模拟算法
返回ip.length() % 7;
}
}
org.apache.hive
hive 执行程序
3.1.2
(三)任务三:数据统计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,并与开发的类关联起来;
答案:添加jar /root/eduhq/udf_jars/hive-udf-behavior-1.0.0.jar
创建函数url_trans 作为com.hive.udf.url_trans;
创建函数get_city_by_ip 为com.hive.udf.get_city_by_ip;
(4)在Hive客户端上,使用select语句测试url_trans和get_city_by_ip函数;
答:根据具体功能使用。例如:
选择get_city_by_ip(ip);
(5)启用Hive的动态分区功能,并将Hive设置为非严格模式;
答案:设置hive.exec.dynamic.partition=true;
设置hive.exec.dynamic.partition.mode=nostrict;
(6)使用insert overwrite . select .子句将ods_behavior_log表中的数据插入到分区表dwd_behavior_log中,实现基于dt的动态分区。
答案:插入覆盖表dwd_behavior_log PARTITION (dt) select *,date_format(dt,'yyyy-MM-dd') from ods_behavior_log;
2. 子任务2:数据统计
查看dwd_behavior_log表所有现有分区;答案:显示分区dwd_behavior_log;
查看外部表dwd_behavior_log中前3行数据,验证URL协议是否统一为“http”,是否可以通过IP获取“省”和“城市”信息;答案:SELECT * FROM dwd_behavior_log LIMIT 3;
从dwd_behavior_log 选择URL,其中URL 类似于“http://%”;
返回以“http://”开头的所有URL。如果返回的行数大于0,则说明URL协议统一为“http”。
通过ip获取省份,例如: select get_city_by_ip(ip);
统计外部表dwd_behavior_log的数据总行数。答案:从dwd_behavior_log 中选择COUNT(*);
获取更多资讯,请联系
武汉微众智能创新科技有限公司
了解更多信息请登录www.whwzzc.com,咨询电话13037102709
*本资料中的产品图片和技术数据仅供参考,如有更新,恕不另行通知。微众保留对具体内容的解释权。