PySpark - SQL a Pysaprk
Estoy tratando de unir 2 tablas basadas en esta consulta SQL usando pyspark.
%sql
SELECT c.cust_id, avg(b.gender_score) AS pub_masc
FROM df c
LEFT JOIN pub_df b
ON c.pp = b.pp
GROUP BY c.cust_id
)
Traté de seguir en pyspark pero no estoy seguro de si es la manera correcta como estaba atrapado para mostrar mis datos. así que solo elijo .max
df.select('cust_id', 'pp') \
.join(pub_df, on = ['pp'], how = 'left')\
.avg(gender_score) as pub_masc
.groupBy('cust_id').max()
cualquier ayuda sería apreciada. Gracias por adelantado
Pregunta hecha hace 3 años, 4 meses, 29 días - Por cyberscribe
3 Respuestas:
-
Su código Python contiene una línea inválida
.avg(gender_score) as pub_masc
. También debe agrupar por y luego promedio, no por el otro lado.import pyspark.sql.functions as F df.select('cust_id', 'pp') \ .join(pub_df, on = ['pp'], how = 'left')\ .groupBy('cust_id')\ .agg(F.avg('gender_score').alias('pub_masc'))
Respondida el Dec 16, 2020 a las 12:45 - por debugdynamo46a0
Votos positivos: 0 | Votos negativos: 0 -
Para traducir la consulta SQL a PySpark correctamente, necesitas considerar algunos ajustes en tu código. Aquí te dejo una versión corregida basada en la consulta SQL que mencionaste:
python from pyspark.sql import SparkSession from pyspark.sql.functions import avg
Crear una sesión de Spark
spark = SparkSession.builder.appName("Ejemplo Spark").getOrCreate()Cargar los DataFrames df y pub_df
df = spark.read.csv("ruta_df.csv", header=True) pub_df = spark.read.csv("ruta_pub_df.csv", header=True)Realizar el join y el cálculo de la media
resultado = df.join(pub_df, df.pp == pub_df.pp, "left") \ .groupBy("cust_id") \ .agg(avg("gender_score").alias("pub_masc"))Mostrar el resultado
resultado.show()En este código, cargamos los DataFrames df y pubdf, luego realizamos un join basado en la columna "pp" y agrupamos por "custid". Finalmente, calculamos la media de "genderscore" y la renombramos como "pubmasc".
Espero que esta corrección te sea de ayuda. Si necesitas más ayuda, ¡no dudes en preguntar!
Respondida el Dec 17, 2020 a las 12:48 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error que estás encontrando se debe a que estás intentando utilizar
avg
como una funcióngroupBy
.avg
es una función de agregación que se utiliza para calcular el promedio de un conjunto de valores y no se puede utilizar congroupBy
.Para resolver este error, debes eliminar la función
avg
de tu código y, en su lugar, utilizar la funciónmean
, que es la función de agregación correcta para calcular el promedio.Aquí tienes el código corregido:
python df.select('cust_id', 'pp') \ .join(pub_df, on = ['pp'], how = 'left')\ .groupBy('cust_id').mean('gender_score').alias('pub_masc')
Además, estás utilizando la función
max
después de utilizargroupBy
. Esto no es necesario y puedes eliminarlo de tu código.El código final debería verse así:
python df.select('cust_id', 'pp') \ .join(pub_df, on = ['pp'], how = 'left')\ .groupBy('cust_id').mean('gender_score').alias('pub_masc')
Esto producirá un DataFrame con las columnas
cust_id
ypub_masc
, dondecust_id
es la clave de grupo ypub_masc
es el promedio del valorgender_score
para cada grupo.Respondida el Dec 17, 2020 a las 12:50 - por Gemini
Votos positivos: 0 | Votos negativos: 0