Calcul de la durée en soustrayant deux colonnes datetime au format chaîne
J'ai une Étincelle Dataframe dans qui consiste en une série de dates:
from pyspark.sql import SQLContext
from pyspark.sql import Row
from pyspark.sql.types import *
sqlContext = SQLContext(sc)
import pandas as pd
rdd = sc.parallelizesc.parallelize([('X01','2014-02-13T12:36:14.899','2014-02-13T12:31:56.876','sip:4534454450'),
('X02','2014-02-13T12:35:37.405','2014-02-13T12:32:13.321','sip:6413445440'),
('X03','2014-02-13T12:36:03.825','2014-02-13T12:32:15.229','sip:4534437492'),
('XO4','2014-02-13T12:37:05.460','2014-02-13T12:32:36.881','sip:6474454453'),
('XO5','2014-02-13T12:36:52.721','2014-02-13T12:33:30.323','sip:8874458555')])
schema = StructType([StructField('ID', StringType(), True),
StructField('EndDateTime', StringType(), True),
StructField('StartDateTime', StringType(), True)])
df = sqlContext.createDataFrame(rdd, schema)
Ce que je veux faire est de trouver duration
en soustrayant EndDateTime
et StartDateTime
. J'ai pensé que je voudrais essayer et de le faire à l'aide d'une fonction:
# Function to calculate time delta
def time_delta(y,x):
end = pd.to_datetime(y)
start = pd.to_datetime(x)
delta = (end-start)
return delta
# create new RDD and add new column 'Duration' by applying time_delta function
df2 = df.withColumn('Duration', time_delta(df.EndDateTime, df.StartDateTime))
Cependant, cela me donne juste:
>>> df2.show()
ID EndDateTime StartDateTime ANI Duration
X01 2014-02-13T12:36:... 2014-02-13T12:31:... sip:4534454450 null
X02 2014-02-13T12:35:... 2014-02-13T12:32:... sip:6413445440 null
X03 2014-02-13T12:36:... 2014-02-13T12:32:... sip:4534437492 null
XO4 2014-02-13T12:37:... 2014-02-13T12:32:... sip:6474454453 null
XO5 2014-02-13T12:36:... 2014-02-13T12:33:... sip:8874458555 null
Je ne sais pas si ma démarche est correcte ou non. Si non, je serais heureux d'accepter un autre a suggéré de façon à atteindre cet objectif.
source d'informationauteur Jason
Vous devez vous connecter pour publier un commentaire.
Comme d'Étincelle 1.5 vous pouvez utiliser unix_timestamp:
Note la Java style de format de l'heure.
Merci à David Griffin. Voici comment faire pour référence future.
L'application de
time_delta()
vous donnera la durée en secondes:Renvoie le nombre de jours à partir de début à la fin.
https://spark.apache.org/docs/1.6.2/api/java/org/apache/spark/sql/functions.html
Ici est une version de travail pour spark 2.x dérivée de jason réponse
Cela peut être fait dans spark-sql par la conversion de la chaîne de la date d'horodatage et de la différence.
1: Convertir timestamp:
2: Obtenir la différence entre les dates à l'aide
datediff
fonction.Ce sera combiné à une fonction imbriquée comme:
Ci-dessous est le résultat:
Référence: https://docs-snaplogic.atlassian.net/wiki/spaces/SD/pages/2458071/Date+Functions+and+Properties+Spark+SQL