Saltar al contenido

Conversión de época a fecha y hora en el marco de datos de PySpark usando udf

Después de indagar en varios repositorios y páginas al terminar nos hemos encontrado la respuesta que te compartiremos pronto.

Solución:

no necesitas un udf funcion para eso

Todo lo que necesitas es elabore la columna de época doble para timestampType() y luego usar data_format funciona como se muestra a continuación

from pyspark.sql import functions as f
from pyspark.sql import types as t
df.withColumn('epoch', f.date_format(df.epoch.cast(dataType=t.TimestampType()), "yyyy-MM-dd"))

esto te dará una string fecha

root
 |-- epoch: string (nullable = true)
 |-- var1: double (nullable = true)
 |-- var2: double (nullable = true)

Y puedes usar to_date funciona de la siguiente manera

from pyspark.sql import functions as f
from pyspark.sql import types as t
df.withColumn('epoch', f.to_date(df.epoch.cast(dataType=t.TimestampType())))

que te daría date como datatype a epoch columna

root
 |-- epoch: date (nullable = true)
 |-- var1: double (nullable = true)
 |-- var2: double (nullable = true)

espero que la respuesta sea de ayuda

La respuesta de Ramesh Maharjan no admite la obtención de milisegundos o microsegundos en la marca de tiempo. La respuesta actualizada para agregar soporte para milisegundos es la siguiente:

Implementando el enfoque sugerido en la respuesta de Dao Thi

import pyspark.sql.functions as F
df = spark.createDataFrame([('22-Jul-2018 04:21:18.792 UTC', ),('23-Jul-2018 04:21:25.888 UTC',)], ['TIME'])
df.show(2,False)
df.printSchema()

Producción:

+----------------------------+
|TIME                        |
+----------------------------+
|22-Jul-2018 04:21:18.792 UTC|
|23-Jul-2018 04:21:25.888 UTC|
+----------------------------+
root
|-- TIME: string (nullable = true)

Mudado string formato de tiempo (incluyendo milisegundos) a unix_timestamp(doble). Extrayendo milisegundos de string usando el método de subcadena (start_position = -7, length_of_substring=3) y agregando milisegundos por separado a unix_timestamp. (Transmitir a subcadena para flotar para agregar)

df1 = df.withColumn("unix_timestamp",F.unix_timestamp(df.TIME,'dd-MMM-yyyy HH:mm:ss.SSS z') + F.substring(df.TIME,-7,3).cast('float')/1000)

Mudado unix_timestamp(doble) a tipo de datos de marca de tiempo en Chispa.

df2 = df1.withColumn("TimestampType",F.to_timestamp(df1["unix_timestamp"]))
df2.show(n=2,truncate=False)

Esto le dará la siguiente salida

+----------------------------+----------------+-----------------------+
|TIME                        |unix_timestamp  |TimestampType          |
+----------------------------+----------------+-----------------------+
|22-Jul-2018 04:21:18.792 UTC|1.532233278792E9|2018-07-22 04:21:18.792|
|23-Jul-2018 04:21:25.888 UTC|1.532319685888E9|2018-07-23 04:21:25.888|
+----------------------------+----------------+-----------------------+

Comprobando el esquema:

df2.printSchema()


root
 |-- TIME: string (nullable = true)
 |-- unix_timestamp: double (nullable = true)
 |-- TimestampType: timestamp (nullable = true)

Si piensas que te ha sido útil nuestro artículo, agradeceríamos que lo compartas con otros entusiastas de la programación de esta forma contrubuyes a difundir nuestra información.

¡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 *