记录了一个迷你项目的分析判断流程以及遇到的问题
文章摘要
本迷你数据分析项目因Hive/Hadoop内存不足无法执行MR任务,转而采用AWK命令成功完成分析。关键步骤包括:创建数据文件、解决Hive建表关键字冲突问题、通过AWK实现三类分析(品类转化率/用户行为统计/时段分布)。核心收获包括掌握AWK工具使用、理解Hive局限性(如内存敏感和关键字限制),以及灵活切换技术方案的能力(Hive→AWK)。项目验证了轻量级工具在小数据场景的高效性,建议后续在资源充足时可尝试Hive/Spark处理更大数据集。当前AWK方案已完整输出所有分析指标。
项目摘要
用Linux Shell和AWK处理了一份电商行为模拟数据(约500条记录),做了简单的统计汇总。主要目的是练手数据处理流程,项目本身不大,重在跑通全流程。
1 项目背景
目标:完成一个迷你数据分析项目,掌握Hive+Hadoop的基本操作
实际情况:
成功完成数据分析
Hive/Hadoop因内存问题无法正常执行MR任务
采用AWK命令替代,成功得出分析结果
技术栈:Hive ,Hadoop , AWK , Linux Shell
2 完整操作步骤回顾
第1步:创建数据文件
cd /usr/local/hadoop/project_datapwd记住路径,后面要用到
遇到的问题:找不到文件,先查看文件在哪里,再进入文件目录,用下面的命令查看
# 在当前目录查看所有文件 ls -la /usr/local/hadoop/第2步:Hive建表
遇到障碍
-- 第一次建表失败 create table behavior ( user_id int, item_id int, category string, action string, time string -- time是保留关键字 ); -- 报错:ParseException line 6:2 cannot recognize input near 'time'修改代码,先删掉表再创建表
drop table behavior;问题解决完后,继续建表,并加载数据
create table behavior ( user_id int, item_id int, category string, action string, action_time string -- 避开关键字 );加载数据
#路径为pwd显示的,如 /usr/local/hadoop/hive_data load data local inpath '/usr/local/hadoop/hive_data' overwrite into table behavior;经验总结:
time、date、timestamp是Hive保留关键字,不能用作字段名建表时加前缀是好习惯:
user_id、action_time、create_date
第3步:Hive查询失败
执行下面的命令之后,出现报错,内存问题
select count(*) from behavior; -- 报错:FAILED: Execution Error, return code 2因为机器内存不够,所以MapReduce任务无法启动,执行不了hive查询。本地模式设置了减小内存,但仍然失败,Memory是6GB
#关MR,走本地 set hive.exec.mode.local.auto=true; set hive.exec.mode.local.auto.inputbytes.max=50000000; --50MB /* 50,000,000 bytes ÷ 1024 = 48,828 KB 48,828 KB ÷ 1024 = 47.68 MB ≈ 50 MB */应对:不用Hive,改用Linux命令直接分析CSV文件
第4步:AWK命令分析
分析1:各品类转化率
awk -F',' ' NR>1 { if($3=="电子" && $4=="浏览") views_e++ if($3=="电子" && $4=="购买") buys_e++ if($3=="服装" && $4=="浏览") views_c++ if($3=="服装" && $4=="购买") buys_c++ if($3=="食品" && $4=="浏览") views_f++ if($3=="食品" && $4=="购买") buys_f++ } END { print "品类\t浏览数\t购买数\t转化率%" print "电子\t" views_e "\t" buys_e "\t" buys_e*100/views_e print "服装\t" views_c "\t" buys_c "\t" buys_c*100/views_c print "食品\t" views_f "\t" buys_f "\t" buys_f*100/views_f }' behavior.csv执行后输出
含义:
服装类转化率100%(虽然样本小),说明用户浏览后都买了
电子类转化率66.67%,表现不错
食品类转化率0%,用户只看不买,可能价格或品类有问题
分析2:用户行为汇总
awk -F',' 'NR>1 {print $1","$4}' behavior.csv | sort | awk -F',' ' { user[$1]++; action_list[$1]=action_list[$1]","$2 } END { print "用户ID\t行为总数\t行为类型数\t做过哪些" for(u in user) { split(action_list[u], arr, ",") delete seen count=0 for(i in arr) { if(arr[i]!="" && !seen[arr[i]]++) { count++ } } print u"\t"user[u]"\t"count"\t"action_list[u] } }' | sort -k2 -nr输出
含义:
用户1001是最活跃用户(5次行为,涵盖所有类型)
用户1004也很活跃,行为路径完整(浏览→收藏→加购→购买)
用户1005只是看看,没有深度互动
关键学习:
AWK中数组的用法:
array[key]=valuesplit()函数分割字符串delete删除数组用于去重sort -k2 -nr按第2列数字降序排序
分析3:每小时行为分布
awk -F',' 'NR>1 { hour=substr($5,12,2) print hour","$4 }' behavior.csv | sort | uniq -c | awk ' { print $2"\t"$3"\t"$1 }' | sort输出
上午10点是用户最活跃的时候,逛的人多、买的人也多。到了11点,人流量直接腰斩,啥数据都跟着少了一半
命令链解析:
awk- 提取小时和动作sort- 排序uniq -c- 去重并计数awk- 格式化输出sort- 最终排序
第5步结果分析
数据长什么样
单表behavior,约500条行为记录,包含用户ID、商品ID、行为类型、时间四个字段。
跑了什么分析
各品类转化率
用户行为汇总
每小时行为分布
看到什么结果
服装类转化率100%,电子类66.67%,食品类0%(食品类用户只看不买,需要调整品类或价格)
用户1001最活跃(5次行为覆盖全路径),用户1005仅浏览无互动
上午9-10点是访问高峰,适合推送营销内容
有什么用
验证了AWK+Linux Shell可以快速处理CSV格式的行为数据
简单的SQL查询和分组统计没问题
后续可以加图表展示或者定时自动跑
3 技术栈对比
| 方案 | 优点 | 缺点 | 本次使用 |
|---|---|---|---|
| Hive | SQL语法友好,适合大数据 | 需要Hadoop集群,内存要求高 | 失败 |
| AWK | 轻量级,无需额外服务 | 语法不熟悉,适合小数据 | 成功 |
| Python | 功能强大,易于理解 | 需要安装Python环境 | 备选 |
4 核心经验总结
做对的
遇到障碍及时切换方案:Hive跑不动立即改用AWK
逐步验证:每步都确认结果再继续
保留关键字避坑:
time不能用,改成action_time用
ls和pwd确认文件位置最终用AWK成功完成全部3个分析
踩过的坑
Hive建表字段名不能用关键字(
time)AWK变量名拼接错误(字符串和变量连接格式)
AWK数组语法不熟悉(第一次用二维数组报错)
文件路径不对(一开始找不到CSV文件)
关键命令速记
# 1 创建文件 cat > 文件名 << 'EOF' 内容 EOF# 2 AWK常用模式 awk -F',' '{处理逻辑}' 文件名# 3 管道组合 命令1 | 命令2 | 命令35 复盘感悟
"不是技术多牛,而是遇到问题时能快速找到替代方案"
本次项目的核心价值:
完成了数据分析目标(虽然绕过了Hive)
掌握了AWK这个轻量级数据分析工具
理解了Hive/Hadoop的局限性(内存敏感)
学会了根据实际情况灵活调整技术方案
6 后续优化方向
如果以后数据量增大,可以学习用Hive或Spark处理更大规模数据,目前AWK方案对小数据量已经够用。
但在当前环境下,AWK方案就是最优解!
项目状态:已完成,所有分析指标均得出有效结论!
完结