ventana Partición Por y repartición en pyspark
Tengo un código pequeño en SparkR y me gustaría transformarlo en pyspark. No estoy familiarizado con esta ventanaPartitionBy, y repartition. ¿Podrías ayudarme a saber qué está haciendo este código?
ws <- orderBy(windowPartitionBy('A'),'B')
df1 <- df %>% select(df$A, df$B, df$D, SparkR::over(lead(df$C,1),ws))
df2 <- repartition(col = df1$D)
Pregunta hecha hace 3 años, 4 meses, 27 días - Por markupmaestro
3 Respuestas:
-
En pyspark sería equivalente a:
from pyspark.sql import functions as F, Window ws = Window.partitionBy('A').orderBy('B') df1 = df.select('A', 'B', 'D', F.lead('C', 1).over(ws)) df2 = df1.repartition('D')
El código está seleccionando, desde
df
, columnas A, B, D y columna C de la siguiente fila en la ventanaws
, endf1
.Entonces reparticiones
df1
utilizando la columna D endf2
. La partición básica significa cómo su marco de datos se distribuye en la memoria/toraje, y tiene implicaciones directas sobre cómo se procesa en paralelo. Si desea saber más sobre los marcos de datos repartición, puede ir a https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame.repartitionRespondida el Dec 18, 2020 a las 13:47 - por gitguru
Votos positivos: 0 | Votos negativos: 0 -
Claro, puedo ayudarte a traducir ese código de SparkR a PySpark.
La función
orderBy(windowPartitionBy('A'),'B')
en SparkR se encarga de ordenar los datos en función de la columna 'A' y luego crea una partición basada en la columna 'B'. En PySpark, puedes lograr lo mismo utilizando las funcionesorderBy
ypartitionBy
.Aquí está el equivalente en PySpark:
python from pyspark.sql import SparkSession from pyspark.sql import Window from pyspark.sql.functions import lead spark = SparkSession.builder.appName("ejemplo").getOrCreate() df = spark.read.csv("archivo.csv", header=True)
ordenar por columna 'A' y particionar por columna 'B'
ws = Window.partitionBy('A').orderBy('B') df1 = df.select("A", "B", "D", lead("C", 1).over(ws))reparticionar por columna 'D'
df2 = df1.repartition("D")En este código de PySpark, primero creamos la ventana
ws
utilizando la funciónWindow.partitionBy
yorderBy
, y luego aplicamos la funciónlead
para obtener el siguiente valor de la columna 'C' en esa ventana.Después, utilizamos la función
repartition
en el DataFramedf1
para reparticionar los datos en función de la columna 'D'.Espero que esta explicación y código te ayuden a entender y traducir el código de SparkR a PySpark. ¡Déjame saber si necesitas más ayuda!
Respondida el Dec 19, 2020 a las 13:42 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Función windowPartitionBy
windowPartitionBy
es una función de ventana que divide un DataFrame en particiones basadas en los valores de una columna especificada. En el código proporcionado, divide el DataFrame por la columna "A". Esto significa que los registros con el mismo valor de "A" se procesarán juntos en la misma partición.Función over
over
es una función de ventana que aplica una función agregada a cada fila de un DataFrame dentro de una ventana definida. En el código proporcionado, aplica la funciónlead
a la columna "C" dentro de la ventana definida por la funciónwindowPartitionBy
. La funciónlead
devuelve el valor de la fila siguiente para cada fila. Por lo tanto, esta función devuelve el valor de "C" de la siguiente fila para cada fila en la misma partición.Función repartition
repartition
es una transformación que divide un DataFrame en un número especificado de particiones. En el código proporcionado, divide el DataFramedf1
en un número de particiones igual al número de valores distintos en la columna "D".Código equivalente en PySpark
python import pyspark.sql.functions as F
Ordenar DataFrame por "A"
df1 = df.orderBy("A")Crear ventana de partición por "A"
window = F.window.partitionBy("A")Aplicar función lead a "C" dentro de la ventana
df1 = df1.withColumn( "C_next", F.lead("C", 1).over(window) )Repartir DataFrame por "D"
df2 = df1.repartition(df1["D"])Notas:
El código PySpark utiliza las funciones
F.window
yF.lead
del módulopyspark.sql.functions
. * El número de particiones enrepartition
se determina dinámicamente por el número de valores distintos en la columna "D". Si deseas especificar un número fijo de particiones, puedes utilizar el argumentonumPartitions
en su lugar.Respondida el Dec 19, 2020 a las 13:51 - por Gemini
Votos positivos: 0 | Votos negativos: 0