当前位置: 首页 > news >正文

Databricks中用PySpark找到表里的最短唯一键

以下代码在 Databricks (Serverless) 中运行,通过贪心后向消除算法找出表的最短唯一键。若整表存在完全重复的行,则生成一条 SELECT 语句用于查看其中一组重复记录。

frompyspark.sqlimportfunctionsasFfrompyspark.sqlimportSparkSession# 假设 spark 已由 Databricks 环境提供# 输入表名,可通过 widget 或直接赋值table_name="your_catalog.your_schema.your_table"# 请替换为实际表名# 1. 读取表并获取总行数df=spark.table(table_name)total_rows=df.count()all_cols=df.columnsprint(f"表总行数:{total_rows}")print(f"全部字段:{all_cols}")# 2. 检查整表是否完全去重(所有字段组合)full_distinct=df.select(all_cols).distinct().count()iffull_distinct<total_rows:print("表在所有字段上存在完全重复的行,正在生成筛选一条重复记录的 SELECT 语句...")# 取一组重复记录:按所有字段分组,取 count>1 的第一组dup_group=(df.groupBy(all_cols).agg(F.count("*").alias("cnt")).filter(F.col("cnt")>1).select(all_cols).limit(1).collect())ifdup_group:row=dup_group[0]# 构建 WHERE 条件,注意处理 NULL 和数据类型conditions=[]forcol_nameinall_cols:val=row[col_name]ifvalisNone:conditions.append(f"{col_name}IS NULL")else:# 字符串类型需要加引号,简单起见使用 repr() 转为字面量conditions.append(f"{col_name}={repr(val)}")where_clause=" AND ".join(conditions)select_sql=f"SELECT * FROM{table_name}WHERE{where_clause};"print("筛选一组重复记录的 SQL 语句:")print(select_sql)else:print("未找到重复记录,请检查数据。")else:# 3. 贪心后向消除寻找最短唯一键current_cols=all_cols.copy()# 当前候选列# 不断尝试移除一列,直到无法再移除changed=Truewhilechanged:changed=False# 遍历当前候选列,寻找可以移除的列forcolincurrent_cols:test_cols=[cforcincurrent_colsifc!=col]# 计算 test_cols 的去重行数test_distinct=df.select(test_cols).distinct().count()iftest_distinct==total_rows:# 移除该列后仍能唯一标识,执行移除并跳出本次循环current_cols=test_cols changed=Truebreak# 修改了列组合,重新开始检查print(f"找到的最短唯一键:{current_cols}")print(f"该组合字段数:{len(current_cols)}")# 可选:展示该唯一键的去重行数(应等于总行数)final_distinct=df.select(current_cols).distinct().count()print(f"唯一键去重行数:{final_distinct}(总行数:{total_rows})")

说明:

  1. 不持久化:代码没有使用 persist()、cache() 或 checkpoint(),完全依赖 Spark 的惰性计算,每次 count() 都会触发重算表,符合 Serverless 限制。
  2. 算法逻辑:从全部字段开始,贪心地尝试删减字段,只要删减后去重行数仍等于表总行数,就永久删除该字段,直到无法删除为止。
  3. 重复处理:若所有字段去重后仍小于总行数,则通过分组找出一组重复值,并用这些值拼接成 SELECT * FROM 表 WHERE 条件 的语句,可直接运行查看重复行。
  4. NULL 安全:生成条件时对 None 使用 IS NULL,其他值使用 repr() 保证字符串正确转义。

可将 table_name 替换为实际的三级表名(如 hive_metastore.default.my_table)后直接在 Databricks Notebook 中运行。

http://www.jsqmd.com/news/1392427/

相关文章:

  • notepad-- 文件对比实战指南:3 步上手差异比对,5 个技巧让代码核查快 10 倍
  • TVA-具身智能最新进展(3):主动视觉感知提升实时性
  • 个体自发用 AI 提效已是职场常态,企业统一推进为何反而频频遇阻
  • 武汉江夏初中毕业生技术学校推荐 i3D AI 三维专业本地可参观试学 - 荆楚笔记
  • GHelper完整使用指南:如何用一个轻量小工具接管华硕笔记本性能控制
  • 合并报表系统有哪些?6家服务商能力对比与选型建议
  • Windows Defender 移除完整指南:三档移除深度与一次 ISO 实战演示
  • OpenBMC:WebUI 与后端接口交互流程
  • OneNote 笔记搬家到 Markdown:用 onenote-md-exporter 一劳永逸的完整教程
  • 【GitOps·入门篇】工具生态:ArgoCD、Flux、Jenkins X 对比选型
  • 2026年智慧步道建设指南:从硬件到运营的全链路解析
  • 聊天记录都在,模型为什么还是会“忘记”?
  • 基于 Java Web 的在线学习教育平台管理系统的设计与实现-----附源码85799-----课程、报名、考试与教学管理的一体化实现
  • TypeScript 灵魂拷问:type 和 interface 到底怎么选?
  • 闲置盒马卡别吃亏!2026年详解盒马卡回收一般几折 - 京顺回收
  • 山东本地综合实力强的职业院校推荐:选校时值得关注的几个维度 - 2027品牌AI展
  • 从一句主题到一支成片:Pixelle-Video 零门槛全自动短视频引擎
  • 视觉自动化测试新范式:用Midscene.js让AI替你点遍全平台界面
  • 告别报错弹窗!NDI Runtime 修复的 8 步阶梯式自救指南(DistroAV 新手向)
  • BarTender提示#807错误:无法在拥有其他许可证的LicensingService上激活节点锁定的 Professional 版许可证 的解决办法
  • 设计高效的 Agentic AI Workflows:从企业流程到 Agent 执行图
  • 2026年福建3D床垫厂家 选品迷茫 适配多需求参考 - 甄选测评馆
  • 【AI智能体速通】06.推理与规划的业务用例
  • 让一张静态照片学会跳舞:ComfyUI-MimicMotionWrapper视频动作迁移从零到一实战
  • 元宇宙对世界模型发展的启发与借鉴意义——以半导体晶圆厂为例
  • 为什么说老金团队是在职备考的“时间合伙人”?
  • 2026 株洲钢琴搬运设备搬运,企业公司搬迁怎么预约服务 - LYL仔仔
  • 2026年国内多媒体信息发布系统厂家 解决适配难题 热门推荐 - 甄选测评馆
  • QQ空间说说一键备份到本地:3步把十年历史说说永久保存
  • 钉钉模拟位置怎么设?Xposed 钉钉助手 3 分钟快速上手指南