Hive综合应用案例-用户搜索日志---------- 禁止修改 ---------- 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 comment '用户id', key string comment '搜索关键词', ranking int comment 'url在返回结果中的排名', or_der int comment '点击顺序', url string comment '网站域名', time string comment '日期') row format delimited fields terminated by ' ' lines terminated by '\n' stored as textfile; ---导入数据:/root/data.txt load data local inpath '/root/data.txt' into table db_search; --分析同一种搜索词,哪个网站域名被用户访问最多,并根据访问次数降序取前十。 select t.key,t.url,t.cnt from( select key,url,count(*) cnt,row_number() over (partition by key order by count(*) desc) rk from db_search group by key,url) t where t.rk<=1 order by t.cnt desc limit 10; ---------- end ----------修改
时间: 2025-05-15 14:03:18 浏览: 35
### Hive 用户搜索日志的数据处理与分析
#### 创建数据库
在使用 Hive 处理用户搜索日志之前,需要先创建一个数据库来存储相关的表和数据。可以通过以下 SQL 命令完成此操作:
```sql
CREATE DATABASE IF NOT EXISTS search_logs;
USE search_logs;
```
上述命令会创建名为 `search_logs` 的数据库并切换到该数据库下工作[^2]。
---
#### 定义表结构
为了存储用户搜索日志,需定义合适的表结构。假设每条日志记录包含以下字段:
- `log_id`: 日志唯一标识符 (BIGINT 类型)
- `user_id`: 用户 ID (STRING 类型)
- `query`: 搜索关键词 (STRING 类型)
- `timestamp`: 时间戳 (TIMESTAMP 类型)
可以使用以下 HQL 语句创建表:
```sql
CREATE TABLE IF NOT EXISTS user_search_logs (
log_id BIGINT,
user_id STRING,
query STRING,
timestamp TIMESTAMP
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
```
这里指定了分隔符为 `\t` 并将文件存储为文本格式。如果数据源是其他格式(如 JSON 或 Parquet),可以根据实际需求调整存储方式[^3]。
---
#### 导入数据
Hive 支持多种方法导入外部数据。一种常见的方式是从 HDFS 文件系统加载数据至指定表中。例如,假设有已上传至 HDFS 路径 `/data/search_logs/` 下的日志文件,则可通过以下命令实现数据导入:
```sql
LOAD DATA INPATH '/data/search_logs/' INTO TABLE user_search_logs;
```
另一种更灵活的方法是利用 Sqoop 工具从关系型数据库(如 MySQL)提取数据并将其写入 Hive 表中[^1]。
---
#### 执行 SQL 查询
一旦完成了数据准备阶段,就可以针对这些数据执行各种复杂的查询操作以满足业务需求。下面列举几个典型场景及其对应的 SQL 实现方案:
##### 场景一:统计每天的总搜索次数
```sql
SELECT DATE(timestamp) AS date, COUNT(*) AS total_searches
FROM user_search_logs
GROUP BY DATE(timestamp);
```
##### 场景二:找出最热门的前十个搜索词
```sql
SELECT query, COUNT(*) AS frequency
FROM user_search_logs
GROUP BY query
ORDER BY frequency DESC
LIMIT 10;
```
##### 场景三:按时间段划分用户的活跃度分布情况
```sql
WITH time_buckets AS (
SELECT CASE
WHEN HOUR(timestamp) BETWEEN 0 AND 5 THEN 'Night'
WHEN HOUR(timestamp) BETWEEN 6 AND 11 THEN 'Morning'
WHEN HOUR(timestamp) BETWEEN 12 AND 17 THEN 'Afternoon'
ELSE 'Evening' END AS period,
COUNT(*) AS count_per_period
FROM user_search_logs
GROUP BY period
)
SELECT * FROM time_buckets ORDER BY count_per_period DESC;
```
以上示例展示了如何通过简单的聚合函数以及窗口函数挖掘隐藏于原始数据背后的洞察力。
---
阅读全文
相关推荐











