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

python 复制代码
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, coalesce, trim, when, lit, sum
from pyspark.sql.types import StringType, NumericType

# 初始化SparkSession
spark = SparkSession.builder \
    .appName("Hive Data Quality Analysis") \
    .enableHiveSupport() \
    .getOrCreate()

# 配置参数
database_name = "your_database"  # 替换为实际数据库名
result_list = []

# 获取数据库所有表
tables = spark.catalog.listTables(database_name)

for table in tables:
    table_name = table.name
    full_table_name = f"{database_name}.{table_name}"
    
    try:
        # 读取Hive表
        df = spark.table(full_table_name)
        df.cache()  # 缓存以提高性能
        total_count = df.count()
        
        if total_count == 0:
            continue
        
        # 为每个字段生成统计指标
        for field in df.schema.fields:
            column_name = field.name
            column_type = str(field.dataType)
            
            # 根据字段类型处理数据
            if isinstance(field.dataType, StringType):
                # 字符串类型处理
                modified_col = trim(coalesce(col(column_name), lit("")))
                condition = (modified_col == lit(""))
                count_expr = sum(when(condition, 1).otherwise(0)).alias("cnt")
            elif isinstance(field.dataType, NumericType):
                # 数值类型处理
                modified_col = coalesce(col(column_name), lit(0))
                condition = (modified_col == lit(0))
                count_expr = sum(when(condition, 1).otherwise(0)).alias("cnt")
            else:
                # 其他类型处理
                condition = col(column_name).isNull()
                count_expr = sum(when(condition, 1).otherwise(0)).alias("cnt")
            
            # 执行计算
            stats = df.agg(count_expr).collect()[0]["cnt"]
            percentage = round((stats / total_count) * 100, 2) if total_count > 0 else 0.0
            
            # 收集结果
            result_list.append((
                database_name,
                table_name,
                column_name,
                column_type,
                stats,
                total_count,
                float(percentage)
            ))
            
        df.unpersist()  # 释放缓存
        
    except Exception as e:
        print(f"Error processing table {table_name}: {str(e)}")
        continue

# 创建结果DataFrame
result_columns = [
    "database_name",
    "table_name",
    "column_name",
    "column_type",
    "stat_count",
    "total_rows",
    "percentage"
]

result_df = spark.createDataFrame(result_list, result_columns)

# 输出结果(可根据需要保存到HDFS或Hive表)
result_df.show(truncate=False)

# 停止SparkSession
spark.stop()

代码说明:

  1. 初始化配置:创建SparkSession并启用Hive支持
  2. 元数据获取:通过Spark Catalog获取指定数据库的所有表
  3. 数据缓存:对每个表进行缓存以提高后续多次操作的性能
  4. 字段类型判断
    • 字符串类型:NULL转空字符串并去除空格
    • 数值类型:NULL转0
    • 其他类型:直接统计NULL值
  5. 统计计算:使用PySpark的表达式进行条件统计
  6. 结果收集:将统计结果组织成结构化数据格式
  7. 结果输出:将最终结果以表格形式展示

注意事项:

  1. 需要替换代码中的your_database为实际数据库名称
  2. 该代码会处理数据库中所有表,如需指定特定表,可修改tables的获取逻辑
  3. 结果展示方式可根据需要修改为写入Hive表或文件系统
  4. 处理大型表时建议增加分区处理逻辑以提高性能
  5. 需要确保Spark集群有足够内存来处理目标表的数据量

输出示例:

复制代码
+-------------+-----------+-----------+-----------+---------+----------+----------+
|database_name|table_name |column_name|column_type|stat_count|total_rows|percentage|
+-------------+-----------+-----------+-----------+---------+----------+----------+
|your_database|customers  |name       |StringType |125      |10000     |1.25      |
|your_database|customers  |age        |IntegerType|324       |10000     |3.24      |
|your_database|orders     |order_date |DateType   |56        |5000      |1.12      |
+-------------+-----------+-----------+-----------+---------+----------+----------+
相关推荐
yumgpkpm21 分钟前
Doris 并入CMP7(类Cloudera CDP 7.3.1 404华为鲲鹏ARM版)的方案和实施源代码
大数据·oracle·sqlite·sqoop·milvus·cloudera
yumgpkpm21 分钟前
Doris在CMP7(类Cloudera CDP 7 404版华为Kunpeng)启用 Kerberos部署Doris
大数据·hive·hadoop·python·oracle·flink·cloudera
YangYang9YangYan22 分钟前
高职大数据技术专业学习与发展指南
大数据·人工智能·学习·数据分析
汤姆yu30 分钟前
基于大数据的天气分析与应用系统
大数据
悦光阴1 小时前
SQL Server 并发控制:Fabric Warehouse只支持快照隔离
大数据·运维·数据库·fabric
DolphinScheduler社区2 小时前
Apache DolphinScheduler 3.3.2 正式发布!性能与稳定性有重要更新
大数据·开源·apache·任务调度·海豚调度·发版
SeaTunnel2 小时前
Apache SeaTunnel 支持 Metalake 开发了!避免任务配置敏感信息暴露
大数据·开源·apache·个人开发·数据集成·seatunnel·看开源之夏
Mr_Art892 小时前
金融行业湖仓实践:Apache Paimon 小文件治理之道
数据仓库·金融·apache
飞雁科技3 小时前
CRM客户管理系统定制开发:如何精准满足企业需求并提升效率?
大数据·运维·人工智能·devops·驻场开发
飞雁科技3 小时前
上位机软件定制开发技巧:如何打造专属工业解决方案?
大数据·人工智能·软件开发·devops·驻场开发