大数据开发学习Day10
一、Linux / Shelltee 双向输出 head/tail 日志查看1. tee命令从标准输入读取数据同时输出到标准输出屏幕 和一个或多个文件tee[选项][文件...]-a,--append追加到文件末尾而不是覆盖 -i, --ignore-interrupts 忽略中断信号--help显示帮助信息--version显示版本信息1.1 基本用法同时输出到屏幕和文件//将echo的输出同时显示在屏幕并写入 file.txtechoHello World|teefile.txt //输出到多个文件echoHello|teefile1.txt file2.txt file3.txt1.2 追加模式不覆盖原有内容echoNew line|tee-aexisting.log1.3 隐藏屏幕输出//只想写入文件不想看屏幕输出echoSecret|teesecret.txt/dev/null1.4 配合 sudo 写入受保护文件//向需要root权限的文件写入内容echo127.0.0.1 example.com|sudotee-a/etc/hosts1.5 在管道中同时保存中间结果//统计命令执行过程中某个阶段的数据catlarge_file.txt|teetemp.txt|greperror|wc-l//temp.txt 保存了完整内容便于后续分析1.6 进程替换同时给多个命令提供数据//一份数据同时给两个不同的命令处理echo-eapple\nbanana\ncherry|tee(sort)(wc-l)/dev/null2. head 命令输出文件的开头部分默认显示前 10 行head[选项][文件...]-nN,--linesN 显示前 N 行-cN,--bytesN 显示前 N 个字节 -q, --quiet,--silent不显示文件名标题多文件时 -v,--verbose总是显示文件名标题--help显示帮助信息2.1 基本用法显示前10行//默认显示前10行headfile.txt //指定显示前20行head-n20file.txthead-20file.txt# 简写形式2.2 显示前 N 个字节//显示前100个字节head-c100file.txt //显示前1KB1024字节head-c1024file.txt2.3 处理多个文件//显示多个文件的前5行会自动显示文件名标题head-n5file1.txt file2.txt file3.txt# 输出示例# file1.txt # line1# line2# ...# file2.txt # line1# ...//禁止显示文件名标题head-q-n5file1.txt file2.txt2.4 与其他命令组合//查看进程列表的前10个psaux|head-10//查看日志文件的前50行head-50/var/log/syslog //排除最后100行只显示前面的内容结合tail使用head-n-100file.txt# 显示除了最后100行之外的所有内容2.5 负数的特殊用法//显示除了最后5行之外的所有行head-n-5file.txt //显示除了最后20字节之外的所有内容head-c-20file.txt3. tail 命令输出文件的结尾部分默认显示后 10 行tail[选项][文件...]-nN,--linesN 显示最后 N 行-cN,--bytesN 显示最后 N 个字节 -f,--follow实时跟踪文件新增内容 -q, --quiet,--silent不显示文件名标题 -v,--verbose总是显示文件名标题3.1 基本用法显示最后10行//默认显示最后10行tailfile.txt //显示最后20行tail-n20file.txttail-20file.txt# 简写形式3.2 实时监控日志最常用//实时跟踪日志文件的新增内容tail-f/var/log/syslog //实时跟踪并显示最后50行tail-n50-fapp.log //更友好的显示加上行号tail-faccess.log|nl3.3 处理日志轮转-F 参数//即使文件被重命名或轮转也能继续跟踪tail-F/var/log/nginx/access.log //-F 比-f更强大 //- 文件被删除/重命名后会重新打开 //适用于logrotate等日志轮转工具3.4 显示最后 N 个字节//显示最后200个字节tail-c200file.txt //显示最后1KBtail-c1024log.txt3.5 从第 N 行开始显示//从第15行开始显示包括第15行tail-n15 file.txt //从第100行开始显示到末尾tail-n100 large_file.txt3.6 组合 tail 和 head 提取中间段落//显示第50-60行先取前60行再取最后11行head-60file.txt|tail-11//显示第100行到文件末尾tail-n100 file.txt //显示第1-100行排除第101行之后head-100file.txt3.7 多文件监控//同时监控多个日志文件tail-ferror.log access.log# 输出会标注文件来源# error.log # error message...# access.log # access message...3.8 配合 PID 自动退出//监控日志当进程1234结束时tail 也退出tail-f--pid1234app.log4. 三个命令对比总结特性teeheadtail主要用途 数据分流/保存 查看文件开头 查看文件结尾 默认行数 无处理所有输入10行10行 是否修改文件 写入文件不修改原内容 只读 只读 实时监控 否 否 是-f/-F 常见场景 保存日志、sudo 写入 预览文件、查看配置 监控日志、查看最新数据5. 任务对 login.log 执行1. 提取 uid第 2 列2. 去重统计3.同时输出到屏幕 并 保存到 uid_stat.log4.只显示前 5 条//login.log2025-04-0910:00:00,uid100,login_success2025-04-0910:01:00,uid101,login_fail2025-04-0910:02:00,uid100,login_successcut-d,-f2login.log|sort|uniq-c|sort-nr|teeuid_stat.log|head-5大数据排查常用实时看日志 留存记录二、SQL511. 游戏玩法分析ISELECTA.player_id,MIN(A.event_date)ASfirst_loginFROMActivity AGROUPBYA.player_id;分组取每组最小日期 首次登录日期多字段 IN 子查询精准匹配首次登录记录典型场景用户首设备、首单、首次访问1596. 每位顾客最经常订购的商品SELECTactivity_dateASlogin_date,COUNT(DISTINCTuser_id)ASuser_countFROMTrafficWHEREactivityloginGROUPBYuser_id,activity_dateHAVINGMIN(activity_date)activity_date;先筛选 login 行为按用户 日期分组只保留最小登录日期按日期统计当日新增登录用1069. 产品销售分析SELECTp.product_name,s.product_id,s.year,s.quantity,s.priceFROMSales sJOINProduct pONs.product_idp.product_idWHERE(s.product_id,s.year)IN(SELECTproduct_id,MIN(year)FROMSalesGROUPBYproduct_id);关联产品表获取名称子查询找到每个产品最早销售年份主表匹配年份取出首年全部销售记录三、PySpark 核心新内容视图与函数 多维度排序 数据采样 性能小优化frompyspark.sqlimportSparkSessionfrompyspark.sqlimportfunctionsasF sparkSparkSession.builder \.master(local[*])\.appName(day10)\.getOrCreate()data[(1,click,100,2025-01-01),(1,buy,200,2025-01-01),(2,view,50,2025-01-02),(3,click,80,2025-01-01),]dfspark.createDataFrame(data,[uid,event,cost,dt])# 新知识点1创建全局临时视图 df.createOrReplaceTempView(user_log)# SQL查询spark.sql(select uid, sum(cost) from user_log group by uid).show()# 新知识点2多列排序 df.orderBy(F.desc(cost),F.asc(uid)).show()# 新知识点3数据采样大数据排查用 df.sample(withReplacementFalse,fraction0.5,seed123).show()# 新知识点4withColumnRenamed 重命名 df.withColumnRenamed(cost,amount).show()spark.stop()createOrReplaceTempView 建临时视图多字段组合排序sample 数据采样字段重命名四、算法LeetCode 209. 长度最小的子数组滑动窗口 O (n) 最优解理解左右指针收缩逻辑对比前缀和 O (n log n) 思路defminSubArrayLen(target,nums):lefttotal0min_lenfloat(inf)forrightinrange(len(nums)):totalnums[right]whiletotaltarget:min_lenmin(min_len,right-left1)total-nums[left]left1returnmin_lenifmin_len!float(inf)else0