【问题标题】:Summary and crosstabulation in Pyspark (DataBricks)Pyspark (DataBricks) 中的汇总和交叉制表
【发布时间】:2022-10-09 04:30:57
【问题描述】:

我有 pyspark 数据框,它想要计算汇总统计信息(该列中所有唯一类别的计数)和交叉制表,其中所有字符串列都有一个固定列。 例如:我的 df 是这样的

col1 col2 col3
Cat1 XYZ A
Cat1 XYZ C
Cat1 ABC B
Cat2 ABC A
Cat2 XYZ B
Cat2 MNO A

我想要这样的东西

VarNAME Category Count A B C
col1 Cat1 3 1 1 1
col1 Cat2 3 2 0 1
col2 XYZ 3 1 1 1
col2 ABC 2 1 1 0
col2 MNO 1 1 0 0
col3 A 3 3 0 0
col3 B 2 0 2 0
Col3 C 1 0 0 1

所以,基本上,我想要使用 col3 和总数对所有单个列进行交叉制表。 我可以使用循环在 Python 中执行此操作,但循环在 pyspark 中有所不同。

【问题讨论】:

标签: pyspark apache-spark-sql databricks


【解决方案1】:

这是我的 2 美分。

  1. 创建了一个示例数据框

     df = spark.createDataFrame(
         [("Cat1","XYZ","A"),
         ("Cat1","XYZ","C"),
         ("Cat1","ABC","B"),
         ("Cat2","ABC","A"),
         ("Cat2","XYZ","B"),
         ("Cat2","MNO","A")
     ],schema = ['col1','col2','col3'])
    
  2. 使用了 Crosstab 函数,它将计算所有 col3 的计数,评估总行数,然后根据列名创建一个新的常量列并将其重命名。 然后对所有这些数据帧执行联合

     from pyspark.sql.functions import *
     import pyspark.sql.functions as fx
    
     df_union = 
     df.crosstab('col1','col3').withColumn('count',fx.expr(("A+B+C"))).withColumn('VarName',lit('col1')).withColumnRenamed('col1_col3','Category').union(
     df.crosstab('col2','col3').withColumn('count',fx.expr(("A+B+C"))).withColumn('VarName',lit('col2')).withColumnRenamed('col2_col3','Category')).union(
     df.crosstab('col3','col3').withColumn('count',fx.expr(("A+B+C"))).withColumn('VarName',lit('col3')).withColumnRenamed('col3_col3','Category'))
    
  3. 根据列顺序打印数据框

    df_union.select('VarName','Category','count','A','B','C').show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多