代码之家  ›  专栏  ›  技术社区  ›  Shankar Panda

Pyspark:如何在Pyspark中聚合列表中所有元素的数据?[副本]

  •  0
  • Shankar Panda  · 技术社区  · 6 年前

    我将所有字符串字段存储在列表对象中。然后,目前我正在传递for循环中的每个字段以计算聚合计数。

    我正在寻找一种方法,一次获得所有字符串列的聚合计数。请帮忙。

    Dataframe(输入数据)有这些记录

    NoOfSegments,SegmentID,Country
    3,2,Bangalore
    3,2,Bangalore
    3,3,Delhi
    3,2,Delhi
    3,3,Delhi
    3,1,Pune
    3,3,Bangalore
    3,1,Pune
    3,1,Delhi
    3,3,Bangalore
    3,1,Delhi
    3,3,Bangalore
    3,3,Pune
    3,2,Delhi
    3,3,Pune
    3,2,Pune
    3,2,Pune
    3,3,Pune
    3,1,Bangalore
    3,1,Bangalore
    

    我的代码:

            input_data.createOrReplaceTempView('input_data')
    
            sub="string"
            category_columns = [name for name, data_type in input_data.dtypes
                                    if sub in data_type]
            df_final_schema = StructType([StructField("Country", StringType())
                               , StructField("SegmentID", IntegerType())
                               , StructField("total_cnt", IntegerType())
                            ])
            df_final=spark.createDataFrame([],df_final_schema)
    
            for cat_col in category_columns:
                query="SELECT {d_name} as Country,SegmentID ,(count(*) over(partition by {d_name},SegmentID)/ count(*) over(partition by NoOfSegments))*100 as total_cnt  from input_temp order by {d_name},SegmentID".format(d_name=cat_col)
                new_df=hc.sql(query)
                df_final = df_final.union(new_df)
    

    结果:

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   eliasah    6 年前

    您可以使用 groupBy groupby ) :

    from pyspark.sql import functions as F
    
    total = df.select(F.sum("NoOfSegments")).take(1)[0][0]
    df \
      .groupBy("SegmentID", "Country") \
      .agg(F.sum('NoOfSegments').alias('sums'))\
      .withColumn('total_cnt', 100 * F.col('sums')/ F.lit(total)) \
      .select('country', 'SegmentID', 'total_cnt') \
      .sort('country', 'SegmentID').show()
    # +---------+---------+---------+
    # |  Country|SegmentID|total_cnt|
    # +---------+---------+---------+
    # |Bangalore|        1|     10.0|
    # |Bangalore|        2|     10.0|
    # |Bangalore|        3|     15.0|
    # |    Delhi|        1|     10.0|
    # |    Delhi|        2|     10.0|
    # |    Delhi|        3|     10.0|
    # |     Pune|        1|     10.0|
    # |     Pune|        2|     10.0|
    # |     Pune|        3|     15.0|
    # +---------+---------+---------+