es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para extraer las marcas de tiempo end de la columna de tipo estructura timeframe en el dataframe de PySpark, puedes utilizar la función getField de pyspark.sql.functions. Aquí te mostramos cómo hacerlo:

    from pyspark.sql.functions import col, date_format
    
    # Extraer las marcas de tiempo 'end' de la columna de tipo estructura 'timeframe'
    ts1 = df.select(date_format(col('timeframe.end'), "yyyy-MM-dd").alias('end_date')).collect()
    ts2 = df.select('timeframe.end').collect()
    
    # Imprimir los resultados
    print(ts1)
    print(ts2)
    

    En el código anterior, col('timeframe.end') devuelve la columna end de la columna de tipo estructura timeframe. La función date_format se utiliza para formatear la marca de tiempo end como una cadena con el formato 'yyyy-MM-dd', obteniendo así únicamente el componente de fecha. La función alias se utiliza para renombrar la columna resultante como end_date. Por último, se llama al método collect para recuperar los valores del dataframe.

    El resultado de este código debería darte los resultados esperados:

    print(ts1)     #[Row(end_date='2021-12-28')]
    print(ts2)     #[Row(end=datetime.datetime(2021, 12, 28, 0, 0))]
    

    Ten en cuenta que ts2 contiene marcas de tiempo con información de zona horaria como objetos datetime.datetime, a diferencia de ts1 que contiene cadenas de fecha.

Comments are closed.