大数据开发学习Day13
一、Linux / Shell
有日志文件 error.log,格式如下
[2025-04-1310:00:00]ERROR uid100 连接失败[2025-04-1310:01:00]INFO uid101 登录成功[2025-04-1310:02:00]ERROR uid100 请求超时[2025-04-1310:03:00]ERROR uid102 认证失败1. 只筛选出含 ERROR 的行
2. 提取第 4 列(uid)
3. 统计每个 uid 出现的错误次数
4. 按次数降序排列
grep"ERROR"error.log|awk'{print $4}'|sort|uniq-c|sort-nrgrep “ERROR”
只保留错误日志,过滤掉正常日志。
→ 大数据生产常用:快速筛异常
awk ‘{print $4}’
按空格分隔取第 4 列(uid)和 cut 区别:
cut 适合固定单个符号分隔(逗号、冒号)
awk 适合空格 / 多空格分隔的日志,更强
sort | uniq -c
先排序,再去重并计数。
→ 固定套路:统计出现频次
二、SQL
612. 平面上的最近距离
几何计算 + 自连接 + 聚合
1. 自连接匹配任意两点
2. 欧几里得距离公式
3. MIN() + ROUND()
SELECTROUND(MIN(SQRT(POWER(p1.x-p2.x,2)+POWER(p1.y-p2.y,2))),2)ASshortestFROMPoint2D p1JOINPoint2D p2ON(p1.x,p1.y)<>(p2.x,p2.y);POWER(a,2) → a²
SQRT( ) → 开平方
MIN( ) → 取最小距离
ROUND(…,2) → 保留两位小数
(a,b) <> (c,d)
联合字段判断不等,避免点自己和自己配对
1045. 买下所有产品的客户
分组计数 + 全集匹配
COUNT(DISTINCT)
分组后 HAVING 计数 = 总产品数
SELECTcustomer_idFROMCustomerGROUPBYcustomer_idHAVINGCOUNT(DISTINCTproduct_key)=(SELECTCOUNT(*)FROMProduct);1709. 每轮的最大大小
分组计数 + 排名 + 取最大值
COUNT() 分组统计
窗口函数排名
筛选 top1
WITHcntAS(SELECTgroup_id,COUNT(*)ASnumFROMEventsGROUPBYgroup_id),ranksAS(SELECTgroup_id,DENSE_RANK()OVER(ORDERBYnumDESC)ASrnkFROMcnt)SELECTgroup_idFROMranksWHERErnk=1;三、PySpark
frompyspark.sqlimportSparkSessionfrompyspark.sqlimportfunctionsasF spark=SparkSession.builder \.master("local[*]")\.appName("day13")\.getOrCreate()data=[(1,101,"click"),(1,101,"buy"),(2,102,"click"),(3,103,"click"),(3,103,"buy"),(3,103,"like")]df=spark.createDataFrame(data,["user_id","item_id","action"])# 1. 按用户统计行为数df.groupBy("user_id")\.agg(F.count("*").alias("action_cnt"))\.show()# 2. 筛选有购买行为的用户df_buy=df.filter(F.col("action")=="buy")df_buy.show()# 3. 左连接还原用户全行为df.join(df_buy.select("user_id").distinct(),on="user_id",how="leftsemi").show()spark.stop()leftsemi join(左半连接)
只保留左表中在右表能找到匹配的数据。
等价于 EXISTS 语句,但性能更高
四、算法
相交链表
找到两个单链表相交的起始节点
classListNode:def__init__(self,x):self.val=x self.next=NonedefgetIntersectionNode(headA,headB):a,b=headA,headBwhilea!=b:a=a.nextifaelseheadB b=b.nextifbelseheadAreturna