Saltar al contenido

Cálculo del porcentaje del recuento total para el grupoUsando pyspark

Si encuentras alguna parte que no entiendes puedes dejarlo en los comentarios y haremos todo lo posible de ayudarte rápidamente.

Solución:

Un ejemplo como alternativa si no se siente cómodo con Windowing como alude el comentario y es la mejor manera de hacerlo:

# Running in Databricks, not all stuff required
from pyspark.sql import Row
from pyspark.sql import SparkSession
import pyspark.sql.functions as F
from pyspark.sql.types import *
#from pyspark.sql.functions import col

data = [("A", "X", 2, 100), ("A", "X", 7, 100), ("B", "X", 10, 100),
        ("C", "X", 1, 100), ("D", "X", 50, 100), ("E", "X", 30, 100)]
rdd = sc.parallelize(data)

someschema = rdd.map(lambda x: Row(c1=x[0], c2=x[1], val1=int(x[2]), val2=int(x[3])))

df = sqlContext.createDataFrame(someschema)

tot = df.count()

df.groupBy("c1") 
  .count() 
  .withColumnRenamed('count', 'cnt_per_group') 
  .withColumn('perc_of_count_total', (F.col('cnt_per_group') / tot) * 100 ) 
  .show()

devoluciones:

 +---+-------------+-------------------+
| c1|cnt_per_group|perc_of_count_total|
+---+-------------+-------------------+
|  E|            1| 16.666666666666664|
|  B|            1| 16.666666666666664|
|  D|            1| 16.666666666666664|
|  C|            1| 16.666666666666664|
|  A|            2|  33.33333333333333|
+---+-------------+-------------------+

Me concentro en Scala y parece más fácil con eso. Dicho esto, la solución sugerida a través de los comentarios usa Window, que es lo que haría en Scala con over().

Si te animas, puedes dejar una noticia acerca de qué te ha gustado de este enunciado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *