web-dev-qa-db-fra.com

Spark Scala: DateDiff de deux colonnes par heure ou par minute

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?

12
mt88

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) )
16
Daniel de Paula

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 $

0
Jeremy