J'ai deux colonnes d'horodatage dans une trame de données pour lesquelles j'aimerais connaître la différence en minute ou bien la différence en heure. Actuellement, je suis en mesure d’obtenir la différence de jour, avec les arrondis, en faisant
val df2 = df1.withColumn("time", datediff(df1("ts1"), df1("ts2")))
Cependant, lorsque j'ai consulté la page du document https://issues.Apache.org/jira/browse/SPARK-8185 .__, je n'ai pas vu de paramètres supplémentaires permettant de modifier l'unité. Est-ce que leur une fonction différente, je devrais utiliser pour cela?
Vous pouvez obtenir la différence en quelques secondes en
import org.Apache.spark.sql.functions._
val diff_secs_col = col("ts1").cast("long") - col("ts2").cast("long")
Ensuite, vous pouvez faire quelques calculs pour obtenir l’unité que vous voulez. Par exemple:
val df2 = df1
.withColumn( "diff_secs", diff_secs_col )
.withColumn( "diff_mins", diff_secs_col / 60D )
.withColumn( "diff_hrs", diff_secs_col / 3600D )
.withColumn( "diff_days", diff_secs_col / (24D * 3600D) )
Ou, dans pyspark:
from pyspark.sql.functions import *
diff_secs_col = col("ts1").cast("long") - col("ts2").cast("long")
df2 = df1 \
.withColumn( "diff_secs", diff_secs_col ) \
.withColumn( "diff_mins", diff_secs_col / 60D ) \
.withColumn( "diff_hrs", diff_secs_col / 3600D ) \
.withColumn( "diff_days", diff_secs_col / (24D * 3600D) )
La réponse donnée par Daniel de Paula fonctionne, mais cette solution ne fonctionne pas dans le cas où la différence est nécessaire pour chaque ligne de votre tableau. Voici une solution qui le fera pour chaque ligne:
import org.Apache.spark.sql.functions
val df2 = df1.selectExpr("(unix_timestamp(ts1) - unix_timestamp(ts2))/3600")
Cela convertit d'abord les données des colonnes en un horodatage Unix en secondes, les soustrait, puis convertit la différence en heures.
Vous trouverez une liste utile de fonctions sur: http://spark.Apache.org/docs/latest/api/scala/#org.Apache.spark.sql.functions $