File tree Expand file tree Collapse file tree
main/scala/org/opensearch/spark/sql
test/scala/org/opensearch/spark/sql
main/scala/org/opensearch/spark/sql
test/scala/org/opensearch/spark/sql
main/scala/org/opensearch/spark/sql
test/scala/org/opensearch/spark/sql Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -5,6 +5,9 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
55### Added
66- Add system property ` opensearch.hadoop.version.check.skip ` to bypass multiple JAR version detection ([ #753 ] ( https://github.com/opensearch-project/opensearch-hadoop/pull/753 ) )
77
8+ ### Fixed
9+ - Write Spark ` DateType ` values as UTC start of day so the stored date does not shift by the JVM timezone offset on non UTC JVMs ([ #797 ] ( https://github.com/opensearch-project/opensearch-hadoop/issues/797 ) )
10+
811### Dependencies
912- Bumps ` commons-logging:commons-logging ` from 1.3.5 to 1.3.6
1013- Bumps ` com.fasterxml.jackson.core:jackson-databind ` from 2.21.1 to 2.21.3
Original file line number Diff line number Diff line change @@ -269,7 +269,7 @@ class DataFrameValueWriter(writeUnknownTypes: Boolean = false) extends Filtering
269269 case DoubleType => generator.writeNumber(value.asInstanceOf [Double ])
270270 case FloatType => generator.writeNumber(value.asInstanceOf [Float ])
271271 case TimestampType => generator.writeNumber(value.asInstanceOf [Timestamp ].getTime())
272- case DateType => generator.writeNumber(value.asInstanceOf [Date ].getTime() )
272+ case DateType => generator.writeNumber(value.asInstanceOf [Date ].toLocalDate.atStartOfDay(java.time. ZoneOffset . UTC ).toInstant.toEpochMilli )
273273 case StringType => generator.writeString(value.toString)
274274 case _ => {
275275 val className = schema.getClass().getName()
Original file line number Diff line number Diff line change 3030package org .opensearch .spark .sql
3131
3232import java .io .ByteArrayOutputStream
33+ import java .sql .Date
34+ import java .util .TimeZone
3335
3436import org .apache .spark .sql .Row
3537import org .apache .spark .sql .catalyst .ScalaReflection
3638import org .apache .spark .sql .types .ArrayType
39+ import org .apache .spark .sql .types .DateType
3740import org .apache .spark .sql .types .IntegerType
3841import org .apache .spark .sql .types .MapType
3942import org .apache .spark .sql .types .StringType
@@ -165,4 +168,18 @@ class DataFrameValueWriterTest {
165168 }
166169 }
167170
171+ @ Test
172+ def testWriteDateUsesUtcStartOfDay (): Unit = {
173+ val defaultTimeZone = TimeZone .getDefault
174+ try {
175+ TimeZone .setDefault(TimeZone .getTimeZone(" Asia/Tokyo" ))
176+ val schema = StructType (Seq (StructField (" d" , DateType )))
177+ val row = Row (Date .valueOf(" 2023-07-22" ))
178+ val serialized = serialize(row, schema)
179+ assertTrue(serialized.contains(""" "d":1689984000000""" ))
180+ } finally {
181+ TimeZone .setDefault(defaultTimeZone)
182+ }
183+ }
184+
168185}
Original file line number Diff line number Diff line change @@ -269,7 +269,7 @@ class DataFrameValueWriter(writeUnknownTypes: Boolean = false) extends Filtering
269269 case DoubleType => generator.writeNumber(value.asInstanceOf [Double ])
270270 case FloatType => generator.writeNumber(value.asInstanceOf [Float ])
271271 case TimestampType => generator.writeNumber(value.asInstanceOf [Timestamp ].getTime())
272- case DateType => generator.writeNumber(value.asInstanceOf [Date ].getTime() )
272+ case DateType => generator.writeNumber(value.asInstanceOf [Date ].toLocalDate.atStartOfDay(java.time. ZoneOffset . UTC ).toInstant.toEpochMilli )
273273 case StringType => generator.writeString(value.toString)
274274 case _ => {
275275 val className = schema.getClass().getName()
Original file line number Diff line number Diff line change 3030package org .opensearch .spark .sql
3131
3232import java .io .ByteArrayOutputStream
33+ import java .sql .Date
34+ import java .util .TimeZone
3335
3436import org .apache .spark .sql .Row
3537import org .apache .spark .sql .catalyst .ScalaReflection
3638import org .apache .spark .sql .types .ArrayType
39+ import org .apache .spark .sql .types .DateType
3740import org .apache .spark .sql .types .IntegerType
3841import org .apache .spark .sql .types .MapType
3942import org .apache .spark .sql .types .StringType
@@ -165,4 +168,18 @@ class DataFrameValueWriterTest {
165168 }
166169 }
167170
171+ @ Test
172+ def testWriteDateUsesUtcStartOfDay (): Unit = {
173+ val defaultTimeZone = TimeZone .getDefault
174+ try {
175+ TimeZone .setDefault(TimeZone .getTimeZone(" Asia/Tokyo" ))
176+ val schema = StructType (Seq (StructField (" d" , DateType )))
177+ val row = Row (Date .valueOf(" 2023-07-22" ))
178+ val serialized = serialize(row, schema)
179+ assertTrue(serialized.contains(""" "d":1689984000000""" ))
180+ } finally {
181+ TimeZone .setDefault(defaultTimeZone)
182+ }
183+ }
184+
168185}
Original file line number Diff line number Diff line change @@ -269,7 +269,7 @@ class DataFrameValueWriter(writeUnknownTypes: Boolean = false) extends Filtering
269269 case DoubleType => generator.writeNumber(value.asInstanceOf [Double ])
270270 case FloatType => generator.writeNumber(value.asInstanceOf [Float ])
271271 case TimestampType => generator.writeNumber(value.asInstanceOf [Timestamp ].getTime())
272- case DateType => generator.writeNumber(value.asInstanceOf [Date ].getTime() )
272+ case DateType => generator.writeNumber(value.asInstanceOf [Date ].toLocalDate.atStartOfDay(java.time. ZoneOffset . UTC ).toInstant.toEpochMilli )
273273 case StringType => generator.writeString(value.toString)
274274 case _ => {
275275 val className = schema.getClass().getName()
Original file line number Diff line number Diff line change 3030package org .opensearch .spark .sql
3131
3232import java .io .ByteArrayOutputStream
33+ import java .sql .Date
34+ import java .util .TimeZone
3335
3436import org .apache .spark .sql .Row
3537import org .apache .spark .sql .catalyst .ScalaReflection
3638import org .apache .spark .sql .types .ArrayType
39+ import org .apache .spark .sql .types .DateType
3740import org .apache .spark .sql .types .IntegerType
3841import org .apache .spark .sql .types .MapType
3942import org .apache .spark .sql .types .StringType
@@ -165,4 +168,18 @@ class DataFrameValueWriterTest {
165168 }
166169 }
167170
171+ @ Test
172+ def testWriteDateUsesUtcStartOfDay (): Unit = {
173+ val defaultTimeZone = TimeZone .getDefault
174+ try {
175+ TimeZone .setDefault(TimeZone .getTimeZone(" Asia/Tokyo" ))
176+ val schema = StructType (Seq (StructField (" d" , DateType )))
177+ val row = Row (Date .valueOf(" 2023-07-22" ))
178+ val serialized = serialize(row, schema)
179+ assertTrue(serialized.contains(""" "d":1689984000000""" ))
180+ } finally {
181+ TimeZone .setDefault(defaultTimeZone)
182+ }
183+ }
184+
168185}
You can’t perform that action at this time.
0 commit comments