2016-11-29 1 views
0

Ich habe ein datenframe, das zwei spalte daten in unixtime hat und ich will die woche unterschied zwischen diesen beiden spalten finden. Es gibt eine weekOfYear UDF in SparkSQL, aber das ist nur nützlich, wenn beide Daten im selben Jahr fallen. Wie kann ich dann den Wochendifferenz finden?wie woche unterschied zwischen zwei daten zu finden

p.s. Ich benutze Scala Spark.

+0

Was ist die Version von Spark? –

+0

@ HZ: Überlegen Sie, die beste Antwort zu akzeptieren. – mrsrinivas

Antwort

1

Sie den Ansatz können eine benutzerdefinierte UDF für diese zu schaffen:

scala> val df=sc.parallelize(Seq((1480401142453L,1480399932853L))).toDF("date1","date2") 
df: org.apache.spark.sql.DataFrame = [date1: bigint, date2: bigint] 

scala> df.show 
+-------------+-------------+ 
|  date1|  date2| 
+-------------+-------------+ 
|1480401142453|1480399932853| 
+-------------+-------------+ 


scala> val udfDateDifference=udf((date1:Long,date2:Long)=>((date1-date2)/(60*60*24*7)).toInt 
    | 
    |) 
udfDateDifference: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function2>,IntegerType,Some(List(LongType, LongType))) 

scala> val resultDF=df.withColumn("dateDiffernece",udfDateDifference(df("date1"),df("date2"))) 
resultDF: org.apache.spark.sql.DataFrame = [date1: bigint, date2: bigint ... 1 more field] 

scala> resultDF.show 
+-------------+-------------+--------------+ 
|  date1|  date2|dateDiffernece| 
+-------------+-------------+--------------+ 
|1480401142453|1480399932853|    2| 
+-------------+-------------+--------------+ 

Und so können Sie den Unterschied bekommen!

1

Wie Sie haben UNIXTIME Datumsformat können wir diesen Ausdruck tun.

((date1-date2)/(60*60*24*7)).toInt 

Edit: Aktualisierung dieser Antwort mit Beispiel

spark.udf.register("weekdiff", (from: Long, to: Long) => ((from - to)/(604800)).toInt) 
    // 60*60*24*7 => 604800 
    df.withColumn("weekdiff", weekdiff(df("date1_col_name"), df("date2_col_name"))) 
Verwandte Themen