Skip to content

Commit fb0fdbc

Browse files
Jolanrensenasm0dey
authored andcommitted
feat: adds support for date encoding
1 parent bbbc562 commit fb0fdbc

File tree

4 files changed

+45
-0
lines changed
  • kotlin-spark-api
    • 2.4/src
      • main/kotlin/org/jetbrains/kotlinx/spark/api
      • test/kotlin/org/jetbrains/kotlinx/spark/api
    • 3.0/src
      • main/kotlin/org/jetbrains/kotlinx/spark/api
      • test/kotlin/org/jetbrains/kotlinx/spark/api

4 files changed

+45
-0
lines changed

kotlin-spark-api/2.4/src/main/kotlin/org/jetbrains/kotlinx/spark/api/ApiV1.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,8 @@ private val knownDataTypes = mapOf(
364364
Double::class to DataTypes.DoubleType,
365365
String::class to DataTypes.StringType,
366366
LocalDate::class to `DateType$`.`MODULE$`,
367+
Date::class to `DateType$`.`MODULE$`,
368+
Timestamp::class to `TimestampType$`.`MODULE$`,
367369
Instant::class to `TimestampType$`.`MODULE$`
368370
)
369371

kotlin-spark-api/2.4/src/test/kotlin/org/jetbrains/kotlinx/spark/api/ApiTest.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ import ch.tutteli.atrium.api.fluent.en_GB.*
2121
import ch.tutteli.atrium.domain.builders.migration.asExpect
2222
import ch.tutteli.atrium.verbs.expect
2323
import io.kotest.core.spec.style.ShouldSpec
24+
import org.apache.spark.sql.Dataset
2425
import java.io.Serializable
26+
import java.sql.Date
27+
import java.sql.Timestamp
2528
import java.time.LocalDate
2629

2730
class ApiTest : ShouldSpec({
@@ -156,6 +159,18 @@ class ApiTest : ShouldSpec({
156159

157160
expect(result).asExpect().contains.inOrder.only.values(3, 5, 7, 9, 11)
158161
}
162+
should("be able to serialize Date 2.4") { // uses knownDataTypes
163+
val dataset: Dataset<Pair<Date, Int>> = dsOf(Date.valueOf("2020-02-10") to 5)
164+
dataset.show()
165+
}
166+
should("handle Timestamp Datasets 2.4") { // uses encoder
167+
val dataset = dsOf(Timestamp(0L))
168+
dataset.show()
169+
}
170+
should("be able to serialize Timestamp 2.4") { // uses knownDataTypes
171+
val dataset = dsOf(Timestamp(0L) to 2)
172+
dataset.show()
173+
}
159174
}
160175
}
161176
})

kotlin-spark-api/3.0/src/main/kotlin/org/jetbrains/kotlinx/spark/api/ApiV1.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ val ENCODERS = mapOf<KClass<*>, Encoder<*>>(
5656
String::class to STRING(),
5757
BigDecimal::class to DECIMAL(),
5858
Date::class to DATE(),
59+
LocalDate::class to LOCALDATE(), // 3.0 only
5960
Timestamp::class to TIMESTAMP(),
61+
Instant::class to INSTANT(), // 3.0 only
6062
ByteArray::class to BINARY()
6163
)
6264

@@ -351,6 +353,8 @@ private val knownDataTypes = mapOf(
351353
Double::class to DataTypes.DoubleType,
352354
String::class to DataTypes.StringType,
353355
LocalDate::class to `DateType$`.`MODULE$`,
356+
Date::class to `DateType$`.`MODULE$`,
357+
Timestamp::class to `TimestampType$`.`MODULE$`,
354358
Instant::class to `TimestampType$`.`MODULE$`
355359
)
356360

kotlin-spark-api/3.0/src/test/kotlin/org/jetbrains/kotlinx/spark/api/ApiTest.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ import ch.tutteli.atrium.api.fluent.en_GB.*
2121
import ch.tutteli.atrium.domain.builders.migration.asExpect
2222
import ch.tutteli.atrium.verbs.expect
2323
import io.kotest.core.spec.style.ShouldSpec
24+
import org.apache.spark.sql.Dataset
2425
import java.io.Serializable
26+
import java.sql.Date
27+
import java.sql.Timestamp
28+
import java.time.Instant
2529
import java.time.LocalDate
2630

2731
class ApiTest : ShouldSpec({
@@ -169,6 +173,26 @@ class ApiTest : ShouldSpec({
169173

170174
expect(result).asExpect().contains.inOrder.only.values(3, 5, 7, 9, 11)
171175
}
176+
should("handle LocalDate Datasets") { // uses encoder
177+
val dataset: Dataset<LocalDate> = dsOf(LocalDate.now(), LocalDate.now())
178+
dataset.show()
179+
}
180+
should("handle Instant Datasets") { // uses encoder
181+
val dataset: Dataset<Instant> = dsOf(Instant.now(), Instant.now())
182+
dataset.show()
183+
}
184+
should("be able to serialize Date") { // uses knownDataTypes
185+
val dataset: Dataset<Pair<Date, Int>> = dsOf(Date.valueOf("2020-02-10") to 5)
186+
dataset.show()
187+
}
188+
should("handle Timestamp Datasets") { // uses encoder
189+
val dataset = dsOf(Timestamp(0L))
190+
dataset.show()
191+
}
192+
should("be able to serialize Timestamp") { // uses knownDataTypes
193+
val dataset = dsOf(Timestamp(0L) to 2)
194+
dataset.show()
195+
}
172196
}
173197
}
174198
})

0 commit comments

Comments
 (0)