2017-07-28 5 views
2

Ich versuche, eine einfache SQL-Abfrage auf einige Datenrahmen in auszuführen Funken Shell die Abfrage fügt Intervall von 1 Woche bis zu einem gewissen Zeitpunkt wie folgt:Datum und Intervall-Zusatz in SparkSQL

Die ursprüngliche Abfrage:

scala> spark.sql("select Cast(table1.date2 as Date) + interval 1 week from table1").show() 

Nun, wenn ich habe einige Tests:

scala> spark.sql("select Cast('1999-09-19' as Date) + interval 1 week from table1").show() 

ich die Ergebnisse bekam richtig

+----------------------------------------------------------------------------+ 
|CAST(CAST(CAST(1999-09-19 AS DATE) AS TIMESTAMP) + interval 1 weeks AS DATE)| 
+----------------------------------------------------------------------------+ 
|                 1999-09-26| 
+----------------------------------------------------------------------------+ 

(Just Zugabe von 7 Tagen 19 = 26)

Aber wenn ich das Jahr 1997 statt 1999 die Ergebnisse geändert gerade geändert!

scala> spark.sql("select Cast('1997-09-19' as Date) + interval 1 week from table1").show() 

+----------------------------------------------------------------------------+ 
|CAST(CAST(CAST(1997-09-19 AS DATE) AS TIMESTAMP) + interval 1 weeks AS DATE)| 
+----------------------------------------------------------------------------+ 
|                 1997-09-25| 
+----------------------------------------------------------------------------+ 

Warum die Reuslts geändert? Sollte es nicht 26 nicht 25 sein?

Also, ist dies ein Fehler in SparkSQL im Zusammenhang mit einer Art von itermediate Berechnungen Verlust oder mir fehlt etwas?

Antwort

6

Dies ist wahrscheinlich eine Frage der Umrechnungen in Ortszeit. INTERVAL wirft Daten TIMESTAMP und dann zurück zu DATE:

scala> spark.sql("SELECT CAST('1997-09-19' AS DATE) + INTERVAL 1 weeks").explain 
== Physical Plan == 
*Project [10130 AS CAST(CAST(CAST(1997-09-19 AS DATE) AS TIMESTAMP) + interval 1 weeks AS DATE)#19] 
+- Scan OneRowRelation[] 

(beachten Sie die zweite und dritte CASTs) und Funken bekannt ist inconsequent when handling timestamps zu sein.

DATE_ADD sollte stabileres Verhalten zeigen:

scala> spark.sql("SELECT DATE_ADD(CAST('1997-09-19' AS DATE), 7)").explain 
== Physical Plan == 
*Project [10130 AS date_add(CAST(1997-09-19 AS DATE), 7)#27] 
+- Scan OneRowRelation[] 
+2

Uneinheitliche auch: Wenn Sie einen Cluster Spanning zwei Zeitzonen, Zeitstempel Datumsumstellung haben komplett auseinander fällt (es sei denn, Sie Methoden mit expliziten Zeitzonen jedes Mal verwenden). –