2016-05-05 12 views
5

Mam dwie kolumny timestamp w ramce danych, które chciałbym uzyskać różnicę minutową lub, alternatywnie, różnicę godzinową. Obecnie jestem w stanie uzyskać różnicę dzień, z zaokrągleniem, wykonującSchemat iskrzenia: DateDiff dwóch kolumn według godziny lub minuty

val df2 = df1.withColumn("time", datediff(df1("ts1"), df1("ts2"))) 

Jednak, kiedy spojrzał na stronie doc https://issues.apache.org/jira/browse/SPARK-8185 nie widać żadnych dodatkowych parametrów, aby zmienić jednostkę. Czy ich funkcja powinna być inna?

Odpowiedz

9

można uzyskać różnicę w sekundach przez

import org.apache.spark.sql.functions._ 
val diff_secs_col = col("ts1").cast("long") - col("ts2").cast("long") 

Następnie można zrobić trochę matematyki, aby uzyskać jednostkę chcesz. Na przykład:

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

Albo w 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)) 
0

Odpowiedź udzielona przez Daniel de Paula robót, ale to rozwiązanie nie działa w przypadku, gdy różnica ta jest potrzebna dla każdego wiersza w twoim stole. Oto rozwiązanie, które zrobi to za każdym wierszu:

import org.apache.spark.sql.functions 

val df2 = df1.selectExpr("(unix_timestamp(ts1) - unix_timestamp(ts2))/3600") 

Ten pierwszy przekształca dane w kolumnach uniksowego znacznika czasu w sekundach, odejmuje je, a następnie przekształca różnicę godzin.

A użyteczną listę funkcji można znaleźć na stronie: http://spark.apache.org/docs/latest/api/scala/#org.apache.spark.sql.functions $

+1

Moje rozwiązanie będzie obliczyć różnicę dla każdego wiersza w DataFrame. Dokładniej opisz, czy jest z tym jakiś problem. Ponadto, dla twojego rozwiązania, uważam, że lepiej byłoby unikać wyrażeń łańcuchowych (trudniej je przetestować i bardziej podatnych na błędy): 'val df2 = df1.select ((unix_timestamp (ts1) - unix_timestamp (ts2))/3600D)' . –

Powiązane problemy