Databricks里用PySpark统计指定表和字段中各字段的空值、空字符串或零值比例

发布时间:2026/9/2 15:45:54

Databricks里用PySpark统计指定表和字段中各字段的空值、空字符串或零值比例
frompyspark.sqlimportSparkSessionfrompyspark.sql.functionsimportcol,coalesce,trim,when,lit,sumfrompyspark.sql.typesimportStringType,NumericType# 在 Databricks 中spark 会话通常已经存在无需重新创建# 如果需要显式创建使用# spark SparkSession.builder.getOrCreate()# 配置参数database_nameyour_database# 替换为实际数据库名result_list[]# 获取数据库中的所有表和视图包括 Delta 表tablesspark.catalog.listTables(database_name)fortableintables:table_nametable.name full_table_namef{database_name}.{table_name}try:# 读取表或视图Delta 表和普通表均可dfspark.table(full_table_name)# 快速判断是否为空表避免不必要的缓存total_countdf.count()iftotal_count0:continue# 缓存数据以便多次引用实际上我们只需扫描一次缓存并非必需df.cache()# 构建所有字段的聚合表达式一次性计算agg_exprs[]field_meta[]# 用于记录每个字段的类型和名称forfieldindf.schema.fields:col_namefield.name col_typefield.dataTypeifisinstance(col_type,StringType):# 字符串类型统计 null 或 trim 后为空字符串modified_coltrim(coalesce(col(col_name),lit()))condition(modified_collit())count_exprsum(when(condition,1).otherwise(0)).alias(fcnt_{col_name})elifisinstance(col_type,NumericType):# 数值类型统计 null 或零值modified_colcoalesce(col(col_name),lit(0))condition(modified_collit(0))count_exprsum(when(condition,1).otherwise(0)).alias(fcnt_{col_name})else:# 其他类型仅统计 nullconditioncol(col_name).isNull()count_exprsum(when(condition,1).otherwise(0)).alias(fcnt_{col_name})agg_exprs.append(count_expr)field_meta.append((col_name,str(col_type)))# 执行一次聚合获取所有字段的统计值stats_rowdf.agg(*agg_exprs).collect()[0]# 整理结果forcol_name,col_typeinfield_meta:stat_countstats_row[fcnt_{col_name}]percentageround((stat_count/total_count)*100,2)iftotal_count0else0.0result_list.append((database_name,table_name,col_name,col_type,stat_count,total_count,float(percentage)))df.unpersist()# 释放缓存exceptExceptionase:print(fError processing table{table_name}:{str(e)})continue# 创建结果 DataFrameresult_columns[database_name,table_name,column_name,column_type,stat_count,total_rows,percentage]result_dfspark.createDataFrame(result_list,result_columns)# 显示结果result_df.show(truncateFalse)# 可选将结果保存到 Delta 表# result_df.write.format(delta).mode(overwrite).saveAsTable(your_audit_table)主要改动说明原代码修改后原因显式创建SparkSession并启用 Hive直接使用 Databricks 内置sparkDatabricks 已预配置无需额外初始化对每个字段分别执行df.agg()构建所有字段聚合表达式一次df.agg()减少表扫描次数大幅提高性能缓存df后多次扫描缓存后仅一次聚合扫描配合优化降低缓存开销spark.catalog.listTables()同样使用能返回表和视图无需修改原生支持 Delta 表和视图异常处理与结果收集保持不变逻辑通用注意事项数据库名称根据实际环境修改database_name如果使用默认数据库可设为default。视图spark.table()可以读取持久化视图但临时视图不会出现在listTables中。如需处理临时视图可额外指定名称列表。性能对于大型表df.count()和聚合仍会触发一次完整扫描这是必要的。如果表极大可考虑分批处理或使用抽样估算。Delta 表Delta 表在 Catalog 中通常显示为普通表名读取方式与 Hive 表一致无需特殊处理。

相关新闻

渭河流域地理数据包:矢量边界、DEM、水系与行政区划一站式解决方案

渭河流域地理数据包:矢量边界、DEM、水系与行政区划一站式解决方案

2026/9/2 15:45:54

简介:本资源是一套面向地理信息科学、水文水资源、区域规划及生态环境研究领域的渭河流域综合空间数据集,解决科研与工程实践中流域边界界定不清、多源数据整合困难、制图效率低等痛点。资源共57个文件,包含ArcGIS可编辑MXD工程文件&#xff…

智慧物流、工业与新能源沙盘,重点该怎么呈现?

智慧物流、工业与新能源沙盘,重点该怎么呈现?

2026/9/2 15:45:54

智慧物流园区、工业产线和新能源项目都可以制作沙盘,但三类项目的展示重点并不相同。智慧物流沙盘模型需要讲清物流路径和调度关系,工业沙盘模型更关注设备、工序和厂区组织,新能源沙盘模型则要呈现能源单元、输送关系与应用场景。如果只追求…

平面磁设计实战:从高频优势到量产挑战的工程解析

平面磁设计实战:从高频优势到量产挑战的工程解析

2026/9/2 15:35:54

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

用AI和Godot MCP从零开发超级英雄游戏

用AI和Godot MCP从零开发超级英雄游戏

2026/9/2 17:05:58

用 AI 辅助 Godot 做超级英雄游戏,现在已经不是“能不能做”的问题,而是“怎么把 AI、Godot、MCP 这条链路搭稳,让 AI 真正帮你改项目”。这个组合里最关键的是 Godot MCP:它让 AI 能直接读项目、写脚本、改场景,而不是…

libnest2d详解:基于NFP的2D不规则自动套料实践

libnest2d详解:基于NFP的2D不规则自动套料实践

2026/9/2 17:05:58

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

基于Vue 3与适配器模式构建智能家居硬件模拟系统

基于Vue 3与适配器模式构建智能家居硬件模拟系统

2026/9/2 17:05:58

简介:这是一套面向前端开发者的Vue.js智能家居界面原型设计源码,专为快速构建硬件模拟系统的可视化交互层而打造,适用于中高级前端工程师学习组件化开发、状态管理与响应式UI设计。资源共518个文件,压缩包大小4.52MB,涵…

Nvidia Nemotron 3.5 Lightning:大模型推理加速的工程实践与选型指南

Nvidia Nemotron 3.5 Lightning:大模型推理加速的工程实践与选型指南

2026/9/2 17:05:58

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

FastReport 5.6.2 报表开发核心机制与实操指南

FastReport 5.6.2 报表开发核心机制与实操指南

2026/9/2 17:05:58

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Qwen3.5-9B-Heretic 思维模式评测,融合 Claude 4.6 后推理能力提升明显吗

Qwen3.5-9B-Heretic 思维模式评测,融合 Claude 4.6 后推理能力提升明显吗

2026/9/2 16:55:57

思维模式的“换血”实验:当 Qwen3.5 注入 Claude 4.6 的灵魂 在开源大模型的演进史上,我们见过太多单纯堆砌参数或微调数据的尝试,但很少见到像 Qwen3.5-9B-Claude-4.6-HighIQ-THINKING-HERETIC-UNCENSORED(下文简称 Qwen-Heretic…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/2 10:08:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/2 12:11:52

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

2026/9/2 0:04:59

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

2026/9/2 0:04:59

这次我们来看一个很实用的 DeepSeek 落地场景:用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务,标题写得很直白,但背后其实是一整套可以复用的技术流程:字幕解析、模型调用、批量…

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

2026/9/2 0:04:59

当你家里摆着一台天猫精灵,却总希望语音助手偶尔“不正经”一点,不用官方腔回答问题,而是张口就接几句搞笑段子,会是什么体验?我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱,而是直…

远程协作的工作台整理

远程协作的工作台整理

2026/9/2 6:21:32

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/2 6:21:32

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/2 2:45:06

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…