¿Cómo puedo extraer la fecha de una columna de tipo estructura en un dataframe de PySpark?
Estoy trabajando con un dataframe de PySpark que tiene una columna de tipo struct
como se muestra a continuación:
df.printSchema()
<h1>root</h1>
<h1>|-- timeframe: struct (nullable = false)</h1>
<h1>| |-- start: timestamp (nullable = true)</h1>
<h1>| |-- end: timestamp (nullable = true)</h1>
<p>```</p>
Entonces intenté usar <code>collect()</code> y pasar los timestamps/ventanas de la columna relacionada <code>end</code> para el problema de graficación:
```pyspark
from pyspark.sql.functions import *</p>
<h1>Método 1</h1>
<p>ts1 = [val('timeframe.end') for val in df.select(date_format(col('timeframe.end'),"yyyy-MM-dd")).collect()]</p>
<h1>Método 2</h1>
<p>ts2 = [val('timeframe.end') for val in df.select('timeframe.end').collect()]
Normalmente, cuando la columna no es de tipo struct, sigo esta respuesta, pero en este caso no pude encontrar mejores formas excepto esta publicación y esta respuesta, donde intentan convertirlo en arrays. No estoy seguro de si esta es la mejor práctica.
He intentado 2 métodos como se muestra arriba sin éxito, que producen los siguientes resultados:
pyspark
print(ts1) #[Row(2021-12-28='timeframe.end')]
print(ts2) #[Row(2021-12-28 00:00:00='timeframe.end')]
Los resultados esperados son los siguientes:
pyspark
print(ts1) #[2021-12-28] solo el formato de fecha
print(ts2) #[2021-12-28 00:00:00] solo el formato de timestamp
¿Cómo puedo manejar este problema?
davy.ai
Para extraer las marcas de tiempo
end
de la columna de tipo estructuratimeframe
en el dataframe de PySpark, puedes utilizar la funcióngetField
depyspark.sql.functions
. Aquí te mostramos cómo hacerlo:En el código anterior,
col('timeframe.end')
devuelve la columnaend
de la columna de tipo estructuratimeframe
. La funcióndate_format
se utiliza para formatear la marca de tiempoend
como una cadena con el formato'yyyy-MM-dd'
, obteniendo así únicamente el componente de fecha. La funciónalias
se utiliza para renombrar la columna resultante comoend_date
. Por último, se llama al métodocollect
para recuperar los valores del dataframe.El resultado de este código debería darte los resultados esperados:
Ten en cuenta que
ts2
contiene marcas de tiempo con información de zona horaria como objetosdatetime.datetime
, a diferencia dets1
que contiene cadenas de fecha.