J'essaie de formater ma colonne d'horodatage pour inclure des millisecondes sans succès. Comment puis-je formater mon heure pour qu'elle ressemble à ceci - 2019-01-04 11: 09: 21.152 ?
J'ai regardé la documentation et j'ai suivi le SimpleDataTimeFormat, qui, selon la documentation pyspark, est utilisé par la fonction to_timestamp .
Ceci est mon dataframe.
>>> df.select('updated_date').withColumn("updated_date_col2",
to_timestamp("updated_date", "YYYY-MM-dd HH:mm:ss:SSS")).show(1,False)
+--------------------------+-------------------+
|updated_date |updated_date_col2 |
+--------------------------+-------------------+
|2019-01-04 11:09:21.152815|2019-01-04 11:09:21|
+--------------------------+-------------------+
J'utilise le format milliseconde sans succès comme ci-dessous
+--------------------------+ |updated_date | +--------------------------+ |2019-01-04 11:09:21.152815| +--------------------------+
J'attends updated_date_col2 à mettre en forme comme 2019-01-04 11: 09: 21.152
3 Réponses :
Ce n'est pas une solution avec to_timestamp mais vous pouvez facilement conserver votre colonne au format heure
Le code suivant est un exemple de conversion d'une milliseconde numérique en horodatage.
from datetime import datetime
ms = datetime.now().timestamp() # ex) ms = 1547521021.83301
df = spark.createDataFrame([(1, ms)], ['obs', 'time'])
df = df.withColumn('time', df.time.cast("timestamp"))
df.show(1, False)
+---+--------------------------+
|obs|time |
+---+--------------------------+
|1 |2019-01-15 12:15:49.565263|
+---+--------------------------+
si vous utilisez new Date (). getTime () ou Date.now () dans JS ou datetime.datetime.now (). timestamp () en Python, vous pouvez obtenir une milliseconde numérique.
La solution ci-dessus ne fonctionne pas. je continue à recevoir un objet 'DataFrame' n'a pas d'attribut 'time' même si j'ai importé la bibliothèque datetime
La raison pyspark to_timestamp analyse seulement jusqu'à secondes, tandis que TimestampType a la capacité de contenir des millisecondes.
La solution de contournement suivante peut fonctionner:
Si le modèle d'horodatage contient S, invoquez un UDF pour obtenir la chaîne ' INTERVAL MILLISECONDS 'à utiliser dans l'expression
df = df.withColumn(col_name, df[col_name] + expr(getIntervalStringUDF(df[my_col_name], ts_pattern)))
Pour obtenir INTERVAL 256 MILLISECONDS, nous pouvons utiliser un Java UDF:
ts_pattern = "YYYY-MM-dd HH:mm:ss:SSS"
my_col_name = "time_with_ms"
# get the time till seconds
df = df.withColumn(my_col_name, to_timestamp(df["updated_date_col2"],ts_pattern))
# add milliseconds as inteval
if 'S' in timestamp_pattern:
df = df.withColumn(my_col_name, df[my_col_name] + expr("INTERVAL 256 MILLISECONDS"))
Inside UDF: getIntervalStringUDF (chaîne timeString, modèle de chaîne)
Je pense que vous pouvez utiliser le module datetime standard UDF et Python comme ci-dessous.
import datetime
from pyspark.sql.functions import udf
from pyspark.sql.types import TimestampType
def _to_timestamp(s):
return datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')
udf_to_timestamp = udf(_to_timestamp, TimestampType())
df.select('updated_date').withColumn("updated_date_col2", udf_to_timestamp("updated_date")).show(1,False)
Le type d'horodatage n'a pas de millisecondes. Si vous le souhaitez, vous devrez conserver votre colonne sous forme de chaîne.