3
votes

Pyspark from_unixtime (unix_timestamp) ne se convertit pas en horodatage

J'utilise Pyspark avec Python 2.7. J'ai une colonne de date en chaîne (avec ms) et j'aimerais la convertir en horodatage

C'est ce que j'ai essayé jusqu'à présent

df = df.withColumn('end_time', from_unixtime(unix_timestamp(df.end_time, '%Y-%M-%d %H:%m:%S.%f')) )

printSchema () affiche end_time: string (nullable = true)

quand j'ai utilisé l'horodatage comme type de variable


1 commentaires

Veuillez inclure un exemple reproductible minimal avec quelques petits exemples d'entrées et la sortie souhaitée. Comment créer de bons exemples d'étincelles reproductibles .


4 Réponses :


5
votes

Essayez d'utiliser from_utc_timestamp :

from pyspark.sql.functions import from_utc_timestamp

df = df.withColumn('end_time', from_utc_timestamp(df.end_time, 'PST')) 

Vous auriez besoin de spécifier un fuseau horaire pour la fonction, dans ce cas j'ai choisi PST

Si cela ne fonctionne pas, veuillez nous donner un exemple de quelques lignes montrant df.end_time


2 commentaires

Merci, cela a fonctionné, a également préservé les millisecondes!


Salut Tanjin, je suis tombé sur le même problème. J'ai essayé votre méthode, elle est passée et j'ai obtenu une nouvelle colonne 'start_date' au format d'horodatage, mais les valeurs sont toutes nulles. Pouvez-vous aider à jeter un oeil? df1 = df1.withColumn ('start_date', f.from_utc_timestamp (df1.start_time, 'PST')) df1.printSchema () df1.select ('start_time', 'start_date'). show (5) root | - start_time : string (nullable = true) | - start_date: horodatage (nullable = true) + ------------- + ---------- + | heure_début | date_début | + ------------- + ---------- + | 1597670747141 | null | | 1597664804901 | null |



2
votes

Ce qui suit peut vous aider: -

from pyspark.sql import functions as F
df = df.withColumn("end_time", F.from_unixtime(F.col("end_time"), 'yyyy-MM-dd HH:mm:ss.SS').cast("timestamp"))

[Mis à jour]


2 commentaires

func.col n'est pas défini.


df = SparkSQLContext.createDataFrame ([("2018-02-11 04: 21: 25.12",), ("2018-02-12 04: 22: 26.13",)], ["end_time"]) < / code> Ne fonctionne pas sur ce dataframe, donne des valeurs nulles dans la colonne end_time



4
votes

Créez un exemple de dataframe avec horodatage au format chaîne:

df2.printSchema()


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

Sortie:

+----------------------------+----------------+-----------------------+
|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|
+----------------------------+----------------+-----------------------+

Conversion de chaîne time- format (millisecondes comprises) à unix_timestamp (double) . Étant donné que la fonction unix_timestamp () exclut les millisecondes, nous devons l'ajouter à l'aide d'un autre hack simple pour inclure les millisecondes. Extraction de millisecondes d'une chaîne à l'aide de la méthode substring (start_position = -7, length_of_substring = 3) et ajout de millisecondes séparément à unix_timestamp . (Cast en sous-chaîne en float pour l'ajout)

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

Conversion de unix_timestamp (double) en type de données horodatage dans Spark.

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)

Cela vous donnera la sortie suivante

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

Vérification du schéma:

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()


0 commentaires

1
votes

dans la version actuelle de spark, nous n'avons pas grand-chose à faire en ce qui concerne la conversion d'horodatage.

l'utilisation de la fonction to_timestamp fonctionne plutôt bien dans ce cas. la seule chose dont nous devons faire attention est de saisir le format de l'horodatage en fonction de la colonne d'origine. dans mon cas, il était au format aaaa-MM-jj HH: mm: ss. l'autre format peut être du type MM / jj / aaaa HH: mm: ss ou une combinaison en tant que telle.

from pyspark.sql.functions import to_timestamp
df=df.withColumn('date_time',to_timestamp('event_time','yyyy-MM-dd HH:mm:ss'))
df.show()


0 commentaires