2016-05-05 2 views
5

У меня есть две столбца временной метки в кадре данных, которые я хотел бы получить в минуту, или, наоборот, часовую разницу. В настоящее время я могу получить разницу в день, с округлением, делаяSpark Scala: DateDiff из двух столбцов по часам или минутам

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

Однако, когда я смотрел на странице дока https://issues.apache.org/jira/browse/SPARK-8185 я не видел какие-либо дополнительные параметры, чтобы изменить единицы. Является ли их другой функцией, которую я должен использовать для этого?

ответ

9

Вы можете получить разницу в секундах от

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

Тогда вы можете сделать некоторые математику, чтобы получить единицу вы хотите. Например:

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

Или в 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

Ответ дается Даниэль де Паула работ, но это решение не работает в том случае, когда разница необходима для каждой строки в вашем столе. Вот это решение, которое будет делать, что для каждой строки:

import org.apache.spark.sql.functions 

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

Это сначала преобразует данные в столбцах в метку времени UNIX в секундах, вычитает их, а затем преобразует разницу часов.

полезный список функций можно найти по адресу: http://spark.apache.org/docs/latest/api/scala/#org.apache.spark.sql.functions $

+1

Мое решение будет вычислять значение для каждой строки в DataFrame. Пожалуйста, будьте более конкретными, если есть проблема с этим. Кроме того, для вашего решения я считаю, что лучше избегать строковых выражений (сложнее протестировать и подвергнуть больше ошибок): 'val df2 = df1.select ((unix_timestamp (ts1) - unix_timestamp (ts2))/3600D)' , –

Смежные вопросы