Once parsed into a Timestamp the timestamp is store internally as UTC
and printed as your local timezone (e.g. as defined by
spark.sql.session.timeZone). Spark is good at hiding timezone
information from you.
You can get the timezone information via date_format(column, format):
import org.apache.spark.sql.types.TimestampType
import org.apache.spark.sql.functions._
val sampleDF = Seq("2020-04-11T20:40:00-05:00").toDF("value")
val timestampDF = sampleDF.select($"value".cast(TimestampType))
timestampDF.select(date_format($"value",
"yyyy-MM-dd'T'HH:mm:ssZZZZ")).show(false)
+---------------------------------------------+
|date_format(value, yyyy-MM-dd'T'HH:mm:ssZZZZ)|
+---------------------------------------------+
|2020-04-12T03:40:00+0200 |
+---------------------------------------------+
If you want the timezone only, use
timestampDF.select(date_format($"value", "ZZZZ")).show.
+------------------------+
|date_format(value, ZZZZ)|
+------------------------+
| +0200|
+------------------------+
It all depends how you get the data "downstream". If you go through
parquet or csv files, they will retain the timezone information. If you
go through strings, you should format them as above. If you use
Dataset.map you can access the timestamps as java.sql.Timestamp objects
(but that might not be necessary):
import java.sql.Timestamp
case class Times(value: Timestamp)
timestampDF.as[Times].map(t => t.value.getTimezoneOffset).show
+-----+
|value|
+-----+
| -120|
+-----+
Enrico
Am 31.03.20 um 21:40 schrieb Chetan Khatri:
Sorry misrepresentation the question also. Thanks for your great help.
What I want is the time zone information as it is
2020-04-11T20:40:00-05:00 in timestamp datatype. so I can write to
downstream application as it is. I can correct the lacking UTC offset
info.
On Tue, Mar 31, 2020 at 1:15 PM Magnus Nilsson <ma...@kth.se
<mailto:ma...@kth.se>> wrote:
And to answer your question (sorry, read too fast). The string is
not in proper ISO8601. Extended form must be used throughout, ie
2020-04-11T20:40:00-05:00, there's a colon (:) lacking in the UTC
offset info.
br,
Magnus
On Tue, Mar 31, 2020 at 7:11 PM Magnus Nilsson <ma...@kth.se
<mailto:ma...@kth.se>> wrote:
Timestamps aren't timezoned. If you parse ISO8601 strings they
will be converted to UTC automatically.
If you parse timestamps without timezone they will converted
to the the timezone the server Spark is running on uses. You
can change the timezone Spark uses with
spark.conf.set("spark.sql.session.timeZone","UTC"). Timestamps
represent a point in time, the clock representation of that
instant is dependent on sparks timezone settings both for
parsing (non ISO8601) strings and showing timestamps.
br,
Magnus
On Tue, Mar 31, 2020 at 6:14 PM Chetan Khatri
<chetan.opensou...@gmail.com
<mailto:chetan.opensou...@gmail.com>> wrote:
Hi Spark Users,
I am losing the timezone value from below format, I tried
couple of formats but not able to make it. Can someone
throw lights?
scala> val sampleDF =
Seq("2020-04-11T20:40:00-0500").toDF("value")
sampleDF: org.apache.spark.sql.DataFrame = [value: string]
scala> sampleDF.select('value, to_timestamp('value,
"yyyy-MM-dd\'T\'HH:mm:ss")).show(false)
+------------------------+------------------------------------------------+
|value |to_timestamp(`value`,
'yyyy-MM-dd\'T\'HH:mm:ss')|
+------------------------+------------------------------------------------+
|2020-04-11T20:40:00-0500|2020-04-11 20:40:00
|
+------------------------+------------------------------------------------+
Thanks