2016-05-05 19 views
5

tarafından iki sütun DateDiff Ben alternatif saati farkını ait dakikada farkı alabilir veya istediğiniz bir dataframe iki damgası sütun var. Şu anda ben ben herhangi bir ekstra parametreler birimini değiştirmek için görmedi https://issues.apache.org/jira/browse/SPARK-8185 doc sayfasından baktığında, Ancak Kıvılcım Scala: Saat ya da dakika

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

yaparak, yuvarlama ile, gün farkını elde edebilmek değilim. Bunun için kullanmam gereken farklı bir işlevi var mı?

cevap

9

Sen Sonra İstediğiniz birimi almak için bazı matematik yapabilirsiniz

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

tarafından saniye farkını alabilirsiniz. pyspark içinde

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

Veya: Örneğin:

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

fark her satır için ihtiyaç duyulması halinde çalışmaz Daniel de Paula eser, ama bu çözüm tarafından verilen cevap masanın içinde.

import org.apache.spark.sql.functions 

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

Bu ilk saniyede Unix zaman damgası ile sütunlardaki verileri dönüştürür bunları çıkarır ve sonra saat farkı dönüştürür: Burada her satır için yapacak bir çözümdür.

fonksiyonların yararlı bir listeye

bulunabilir at: http://spark.apache.org/docs/latest/api/scala/#org.apache.spark.sql.functions $

+1

DataFrame her satır için farkı hesaplamak olacaktır Çözümümün. Bununla ilgili bir sorun varsa daha spesifik olun. '-' val df2 = df1.select (unix_timestamp (ts2))/3600D (unix_timestamp (TS1)): Ayrıca, yapılacak çözüm için, ben (test etmek ve daha fazla hata eğilimli zordur) dize ifadelerden kaçınmak için daha iyi olacağına inanıyorum . –