news 2026/8/21 13:59:56

头歌实践教学平台:大数据存储2023(三~四)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
头歌实践教学平台:大数据存储2023(三~四)

三、Hive综合应用案例 — 用户搜索日志分析

第1关:2018年点击量最高的10个网站域名

任务描述
本关任务:分析2018年点击量最高的10个网站域名。

编程要求
在右侧编辑器补充代码,分析出2018年点击量最高的10个网站域名。

创建数据库:mydb

创建原始表:db_search

字段名 类型 注释
id string 用户编号
key string 搜索关键词
ranking int 该URL在返回结果中的排名
or_der int 点击顺序
url string 域名
time string 时间
部分数据如下:

数据切分方式:空格

数据所在位置:/root/data.txt

测试说明
平台会对你编写的代码进行测试:

预期输出:

bbs.union.daqi.com 1822
www.qihoo.com 1714
ent.sina.com.cn 937
bbs.phoenixtv.com 857
yule.sohu.com 827
club.chinaren.com 827
click.cpc.sogou.com 807
blog.sohu.com 737
news.sina.com.cn 649
club.yule.sohu.com 627
开始你的任务吧,祝你成功!

---------- 禁止修改 ----------
drop database if exists mydb cascade;
---------- 禁止修改 ----------


---------- begin ----------
---创建mydb数据库
create database if not exists mydb;

---使用mydb数据库
use mydb;

---创建表db_search
create table if not exists db_search(
id string,
key string,
ranking int,
or_der int,
url string,
time string
)
row format delimited
fields terminated by ' '
stored as textfile;

---导入数据:/root/data.txt
load data local inpath '/root/data.txt' into table db_search;

--查询2018年点击量最多的10个网站域名
select url,count(*) as cnt
from db_search
where time like '2018%'
group by url
order by cnt desc
limit 10;
---------- end ----------

第2关:同一种搜索词,哪个网站域名被用户访问最多

任务描述
本关任务:分析同一种搜索词,哪个网站域名被用户访问最多,并根据访问次数降序取前十。

编程要求
在右侧编辑器补充代码,分析同一种搜索词,哪个网站域名被用户访问最多,并根据访问次数降序取前十。

创建数据库:mydb

创建原始表:db_search

字段名 类型 注释
id string 用户编号
key string 搜索关键词
ranking int 该URL在返回结果中的排名
or_der int 点击顺序
url string 域名
time string 时间
部分数据如下:

数据切分方式:空格

数据所在位置:/root/data.txt

测试说明
平台会对你编写的代码进行测试:

预期输出:

[陋俗] www.qihoo.com 5529
[周恩来] bbs.phoenixtv.com 2050
[女艺人] bbs.union.daqi.com 1662
[北京的GAY吧] love.86gay.com 1217
[张玉凤] bbs.union.daqi.com 1171
[百度] www.baidu.com 1076
[林彪] bbs.phoenixtv.com 885
[明星] club.yule.sohu.com 864
[《十景缎》] book.haahoo.com 638
[富婆] bbs.enet.com.cn 591
开始你的任务吧,祝你成功!

---------- 禁止修改 ----------
drop database if exists mydb cascade;
---------- 禁止修改 ----------


---------- begin ----------
---创建mydb数据库
create database if not exists mydb;

---使用mydb数据库
use mydb;

---创建表db_search
create table if not exists db_search(
id string,
key string,
ranking int,
or_der int,
url string,
time string
)
row format delimited
fields terminated by ' '
stored as textfile;

---导入数据
load data local inpath '/root/data.txt' into table db_search;

-- 1) 先统计每个关键词+域名的访问次数
with key_url_cnt as (
select
key,
url,
count(*) as cnt
from db_search
group by key, url
),
-- 2) 每个关键词内按次数排序,取每组第1名
ranked as (
select
key,
url,
cnt,
row_number() over(partition by key order by cnt desc) as rn
from key_url_cnt
)
-- 3) 只保留每组rn=1,再整体取前十
select
concat('', key, '') as key_tag,
url,
cnt
from ranked
where rn = 1
order by cnt desc
limit 10;
---------- end ----------

第3关:每月最火的搜索词

任务描述
本关任务:分析出每年每月哪个搜索词被搜索次数最多。

编程要求
根据提示,在右侧编辑器补充代码,分析出每年每月哪个搜索词被搜索次数最多。

创建数据库:mydb

创建原始表:db_search

字段名 类型 注释
id string 用户编号
key string 搜索关键词
ranking int 该URL在返回结果中的排名
or_der int 点击顺序
url string 域名
time string 时间
部分数据如下:

数据切分方式:空格

数据所在位置:/root/data.txt

测试说明
平台会对你编写的代码进行测试:

预期输出:

2016-1 [陋俗] 71
2016-2 [陋俗] 202
2016-3 [陋俗] 194
2016-4 [陋俗] 181
2016-5 [陋俗] 197
2016-6 [陋俗] 210
2016-7 [陋俗] 202
2016-8 [陋俗] 206
2016-9 [陋俗] 152
2016-10 [陋俗] 193
2016-11 [陋俗] 176
2016-12 [陋俗] 191
2017-1 [陋俗] 195
2017-2 [陋俗] 193
2017-3 [陋俗] 202
2017-4 [陋俗] 202
2017-5 [陋俗] 189
2017-6 [陋俗] 208
2017-7 [陋俗] 186
2017-8 [陋俗] 201
2017-9 [陋俗] 202
2017-10 [陋俗] 211
2017-11 [陋俗] 192
2017-12 [陋俗] 196
2018-1 [陋俗] 192
2018-2 [陋俗] 170
2018-3 [陋俗] 221
2018-4 [陋俗] 190
2018-5 [陋俗] 192
2018-6 [陋俗] 193
2018-7 [陋俗] 193
2018-8 [陋俗] 194
2018-9 [陋俗] 175
2018-10 [陋俗] 189
2018-11 [陋俗] 207
2018-12 [陋俗] 203
2019-1 [陋俗] 176
2019-2 [陋俗] 172
2019-3 [陋俗] 211
2019-4 [陋俗] 174
2019-5 [陋俗] 188
2019-6 [陋俗] 193
2019-7 [陋俗] 195
2019-8 [陋俗] 205
2019-9 [陋俗] 118
开始你的任务吧,祝你成功!

---------- 禁止修改 ----------
drop database if exists mydb cascade;
---------- 禁止修改 ----------


---------- begin ----------
---创建mydb数据库
create database mydb;

---使用mydb数据库
use mydb;

---创建表db_search
create table db_search(
id int,
key1 string,
ranking int,
or_der int,
url string,
time1 string)
row format delimited fields terminated by ' ' ;

---导入数据:/root/data.txt
load data local inpath '/root/data.txt' into table db_search;

--分析每年每月哪个搜索词被搜索次数最多。
select concat(t.y1,'-',t.m),t.key1,t.cnt
from(
select year(time1) y1,month(time1) m,key1,count(*) cnt,row_number() over (partition by year(time1),month(time1) order by count(*) desc) rk
from db_search group by year(time1),month(time1),key1) t
where t.rk<=1;

---------- end ----------

四、HBase编程:HBase计数器

第1关:HBase计数器

任务描述
本关任务:编写一个 HBase 计数器。

相关知识
HBase 有一个高级功能:计数器(counter)。许多收集统计信息的应用有点击流或在线广告意见,这些应用需要被收集到日志文件中用于后续的分析。用户可以使用计数器做实时统计,从而放弃延时较高的批量处理操作。

计数器简介与之前介绍的原子操作检查并修改(check-and-modify)一样,HBase 也有一种机制可以将列当作计数器。否则,如果用户需要对一行数据加锁,然后读取数据,再对当前数据做加法,最后写回 HBase 并释放该行锁,从而其他写程序可以访问该行数据。这样做会引起大量的资源竞争问题,尤其是当客户端进程崩溃之后,尚未释放的锁需要等待超时恢复——这会在一个高负载的系统中引起灾难性的后果。

客户端 API 提供了专门的方法来完成这种读取并修改(read-and-modify)操作,同时在单独一次客户端的调用过程中保证原子性。早期的 HBase 版本只会在每次计数器更新操作中使用一个 RPC 请求,不过新版本的 HBase 中 CRUD 操作开始使用与此相同的机制,让许多更新计数器的请求都可以在一次 RPC 中完成但是多个计数器必须在同一行。

在Shell中创建并操作计数器
计数器使用 incr 命令,增量可以是正数也可以是负数,但是必须是长整数 Long:

incr '<table>','<rowKey>','<column>',['<increment-value>']
计数器不需要初始化,第一次使用计数器时,计数器被自动设置为 0。

比如我创建的表名为 test,列族分别是 info、score 的表:

create 'test','info','score'
现在我想在 info 这个列族上操作 hits 计数器,使它的值在原来基础上加 1(初始默认为 0):

incr 'test','001','info:hits',1


使用如下命令可以查看一个计数器的值:

get_counter 'table' 'rowKey' 'column'
比如我想读取‘info:hits’计数器的值:

get_counter 'test','001','info:hits'


值得注意的是,在操作计数器的时候只有一种操作,那就是加法操作,如果你想让一个计数器的值减 1,则 ‘increment-value’ 这个参数为 -1 即可,具体规则如下:

值 作用
比零大的值 按给定的值增加计数器的值
零 得到计数器当前的值,不增也不减
比零小的值 按给定的值减少计数器的值


单列增加
在使用计数器时,绝大多数情况下是通过 Java API 来使用,现来介绍单计数器。单计数器顾名思义就是一次操作只能操作一个计数器,用户需要自己设置列,方法由 HTable 类提供,方法签名如下:

incrementColumnValue(byte[] row,byte[] family, byte[] qualifier,long amount);

incrementColumnValue(byte[] row,byte[] family, byte[] qualifier,long amount,boolean writeToWAL);

incrementColumnValue(byte[] row,byte[] family, byte[] qualifier,long amount,Durability durability)。

这三个函数都是直接对表中的某一行数据进行添加,不过后两个函数定义了是否将数据写入到预写日志文件的模式,这三个函数都返回进行增加后的计数器的值。

Configuration config = HBaseConfiguration.create();
config.set("hbase.zookeeper.quorum", "127.0.0.1");// zookeeper地址
config.set("hbase.zookeeper.property.clientPort", "2181");// zookeeper端口
Connection connection = ConnectionFactory.createConnection(config);
TableName tableName = TableName.valueOf("test");
Table table = connection.getTable(tableName);
// 对计数器进行加3操作
long cnt1 = table.incrementColumnValue(Bytes.toBytes("002"), Bytes.toBytes("info"), Bytes.toBytes("hits"), 3);
// 对计数器进行减1操作
long cnt2 = table.incrementColumnValue(Bytes.toBytes("002"), Bytes.toBytes("info"), Bytes.toBytes("hits"), -1);
// 得到当前计数器的值,不做增减操作
long current = table.incrementColumnValue(Bytes.toBytes("002"), Bytes.toBytes("info"), Bytes.toBytes("hits"), 0);


多列增加
Htable 直接对计数器进行增加的话可能只能增加一行,如果对一行中的多个计数器进行增加则需要多次发送 RPC 请求,在新版本的 HBase API 结果中提供了对一行中的多个计数器进行增加的API:

incrementColumnValue(Increment increment)

// 创建Increment实例
Increment increment = new Increment(Bytes.toBytes("003"));
// 在"info:hits"计数器上增加1
increment.addColumn(Bytes.toBytes("info"), Bytes.toBytes("hits"), 1);
// 在"score:hits"计数器上减少10
increment.addColumn(Bytes.toBytes("score"), Bytes.toBytes("hits"), -10);
// 操作计数器
Result result = table.increment(increment);
// 打印操作结果
for (Cell cell : result.rawCells()) {
System.out.println("Cell: " + cell +" Value: " + Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
}
Increament 的使用方法和 Put、Get 等方法是相似的,并且返回一个 result 对象将整行数据进行返回。

Increment 对象也提供了很多方法进行设置:
(1)setWriteToWAL(boolean write):是否将该操作写入到预先日志 HLog中;

(2)setDurability(Durability d):设置读写日志写入的模式;

(3)setReturnResults(boolean returnResults):是否将计数器结果值进行返回。

Increment 对象还提供了其他方法,这里不再进行详细的解释了,可以通过 API 文档进行详细的查看。

编程要求
根据提示,在右侧编辑器的 Begin-End 中补充代码,实现 HBase 计数器的功能,具体要求如下:

在 HBase 表 student 上中 rowkey 为 003 的数据添加计数器,该表列族为 stuinfo,grades,classes;

在“info:hits”计数器上增加 10;

在“grades:hits”计数器上减 3;

在“classes:hits”计数器上增加 4;

最后用一个 result 对象将整行数据进行返回。

测试说明
注意:点击测评之前,请先开启Hadoop(start-dfs.sh)和HBase(start-hbase.sh)。

开始你的任务吧,祝你成功!

package step1;

import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class Task {

public Result counter(Connection connection, TableName tableName) throws IOException {
/********* Begin *********/
// 获取表
Table table = connection.getTable(tableName);
// 创建Increment实例,rowkey为003
Increment increment = new Increment(Bytes.toBytes("003"));
// 在"stuinfo:hits"计数器上增加10
increment.addColumn(Bytes.toBytes("stuinfo"), Bytes.toBytes("hits"), 10);
// 在"grades:hits"计数器上减少3
increment.addColumn(Bytes.toBytes("grades"), Bytes.toBytes("hits"), -3);
// 在"classes:hits"计数器上增加4
increment.addColumn(Bytes.toBytes("classes"), Bytes.toBytes("hits"), 4);
// 执行自增操作,获取结果
Result result = table.increment(increment);
table.close();
return result;
/********* End *********/
}
}

有任何问题都可以随时关注私信!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 13:59:31

从单元测试学Unity开发:guid-based-reference测试套件深度解读

从单元测试学Unity开发&#xff1a;guid-based-reference测试套件深度解读 【免费下载链接】guid-based-reference A component for giving Game Objects a GUID and a class to create references to objects in any Scene by GUID 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/8/21 13:47:08

聊聊Oblique生态:Maven/JitPack集成、版本演进与作者开源故事

聊聊Oblique生态&#xff1a;Maven/JitPack集成、版本演进与作者开源故事 【免费下载链接】Oblique With Oblique explore new styles of displaying images 项目地址: https://gitcode.com/gh_mirrors/ob/Oblique Oblique 是一个开源免费的 Android 斜切图片展示库&…

作者头像 李华
网站建设 2026/8/21 13:46:11

AI大模型qwythos本地部署实战:从零搭建私有化智能引擎

最近&#xff0c;AI大模型领域的一个新名字“qwythos”开始频繁出现在技术社区的讨论中。很多开发者第一眼看到它&#xff0c;可能会被“超强无审查”这样的描述所吸引&#xff0c;但随之而来的是一连串问号&#xff1a;这又是一个昙花一现的“开源明星”&#xff0c;还是真正能…

作者头像 李华
网站建设 2026/8/21 13:45:23

多智能体强化学习对抗卫星通信CSI延迟:DS-PPO与注意力机制实战

1. 项目概述&#xff1a;当多卫星系统遇上“延迟”的挑战在构建一个由多颗卫星组成的协同网络时&#xff0c;我们总会遇到一个看似简单却极其棘手的问题&#xff1a;信息传递需要时间。想象一下&#xff0c;你在地面上指挥一支由多架无人机组成的编队&#xff0c;每架无人机都通…

作者头像 李华
网站建设 2026/8/21 13:43:28

MATLAB与FLUENT联合仿真:打通控制算法与CFD的工程实践

最近在做一个涉及流固耦合的项目&#xff0c;团队里一位刚接触仿真的同事问我&#xff1a;“为什么我们非要用MATLAB和FLUENT一起做&#xff1f;直接用FLUENT的UDF&#xff08;用户自定义函数&#xff09;或者干脆用COMSOL这种多物理场软件不行吗&#xff1f;” 这个问题问得很…

作者头像 李华