pyspark统计指标计算

下面介绍如何使用pyspark处理计算超大数据的统计指标,主要为:最大值、最小值、均值、方差、标准差、中位数、众数、非重复值等。

python 复制代码
# 加载稽核数据
rd_sql = f"select * from database.table"
spark_data = spark.sql(rd_sql)
python 复制代码
# 计算众数 由于spark 2.4版本未内置相关函数 需要自定义
import pyspark.sql.functions as F
# 自定义mode的计算
def sparkdf_mode(df, cols):
    # 构建一个空数据框
    mode_df = pd.DataFrame()
    # 循环每一列
    for col in cols:
        # 先过滤空值
        filtered_df = df.filter(F.col(col).isNotNull())
        # 加个判断 防止数据全空置时报错
        if filtered_df.count()>0:
            # 统计出现次数 排序
            grouped_counts = filtered_df.groupBy(col).count().orderBy(F.col("count").desc())
            # 获取计数值最大的第一行
            first_row = grouped_counts.first()
            # 转sparkdf
            pdf = spark.createDataFrame([first_row], grouped_counts.columns).toPandas()[col]
        else:
            # 数据全空置 赋值None
            pdf = pd.DataFrame({col: [None]}) 
        # 拼接
        mode_df = pd.concat([mode_df, pdf], axis=1)
    return mode_df
python 复制代码
from pyspark.sql.functions import col, count, when, approx_count_distinct
# 分开统计 先统计字符类型
# 统计指标
string_stats = spark_data.select(string_cols+date_cols).summary("max","min").toPandas()
# 非空值数量
string_nonull = spark_data.select([count(when(col(c).isNotNull(), c)).alias(c) for c in (string_cols+date_cols)]).toPandas()
# 非重复值
string_unique = spark_data.agg(*[approx_count_distinct(col(c)).alias(c) for c in (string_cols+date_cols)]).toPandas()
# 众数
string_mode = sparkdf_mode(spark_data, (string_cols+date_cols))
# 添加空值占位
null_rows = pd.DataFrame(None, index=np.arange(len(string_stats), len(string_stats) + 3), columns=string_stats.columns)
string_stats = string_stats.append(null_rows)
# 上下拼接
string_data = pd.concat([string_stats.iloc[:, 1:], string_nonull, string_unique, string_mode])
print(f"string_data稽核完成")
python 复制代码
# 统计数值类型
# 统计指标
float_stats = spark_data.select(float_cols).summary("max","min","mean","50%","stddev").toPandas()
print(f"float_stats稽核完成")
# 非空值
float_nonull = spark_data.select([count(when(col(c).isNotNull(), c)).alias(c) for c in float_cols]).toPandas()
# 非重复值
float_unique = spark_data.agg(*[approx_count_distinct(col(c)).alias(c) for c in float_cols]).toPandas()
# 众数
float_mode = sparkdf_mode(spark_data, float_cols)
# 上下拼接
float_data = pd.concat([float_stats.iloc[:, 1:], float_nonull, float_unique, float_mode])
print(f"float_data稽核完成")
python 复制代码
# 合并转置
pdf = pd.concat([string_data, float_data], axis=1).T
# 重命名
pdf.columns = ["max", "min", "mean", "median", "std", "nonull_cnt", "unique_cnt", "mode"]
# pdf转为sdf
sdf = spark.createDataFrame(pdf)
# 创建临时视图 用于sqlAPI操作
sdf.createOrReplaceTempView("temp_view")
# 插入库表
spark.sql(f"insert overwrite table database.table select * from temp_view")
# 用完删除临时视图
spark.catalog.dropTempView("temp_view")
# 关闭spark
spark.stop()
相关推荐
小宁爱Python5 分钟前
基于 Django+Vue3 的 AI 海报生成平台开发(海报模块专项)
人工智能·python·django
红豆怪怪13 分钟前
[LeetCode 热题 100] 32. 最长有效括号
数据结构·python·算法·leetcode·动态规划·代理模式
Lx35230 分钟前
Hadoop异常处理机制:优雅处理失败任务
大数据·hadoop
小嵌同学42 分钟前
Linux:malloc背后的实现细节
大数据·linux·数据库
R瑾安1 小时前
mysql安装(压缩包方式8.0及以上)
数据库·mysql
大嘴带你水论文1 小时前
震惊!仅用10张照片就能随意编辑3D人脸?韩国KAIST最新黑科技FFaceNeRF解析!
论文阅读·人工智能·python·科技·计算机视觉·3d·transformer
代码的余温1 小时前
MySQL Cluster核心优缺点
数据库·mysql
CodeCraft Studio1 小时前
国产化PDF处理控件Spire.PDF教程:如何在 Java 中通过模板生成 PDF
java·python·pdf·spire.pdf·java创建pdf·从html创建pdf
IT毕设梦工厂2 小时前
大数据毕业设计选题推荐-基于大数据的国家基站整点数据分析系统-Hadoop-Spark-数据可视化-BigData
大数据·hadoop·spark·毕业设计·源码·数据可视化
摆烂z2 小时前
Jupyter Notebook的交互式开发环境方便py开发
ide·python·jupyter