18
18
//
19
19
20
20
import Foundation
21
- import Testing
22
-
23
21
import SparkConnect
22
+ import Testing
24
23
25
24
/// A test suite for `Apache Iceberg` integration
26
25
@Suite ( . serialized)
@@ -31,8 +30,10 @@ struct IcebergTests {
31
30
@Test
32
31
func test( ) async throws {
33
32
guard icebergEnabled else { return }
34
- let t1 = " \( ICEBERG_DATABASE) .TABLE_ " + UUID( ) . uuidString. replacingOccurrences ( of: " - " , with: " " )
35
- let t2 = " \( ICEBERG_DATABASE) .TABLE_ " + UUID( ) . uuidString. replacingOccurrences ( of: " - " , with: " " )
33
+ let t1 =
34
+ " \( ICEBERG_DATABASE) .TABLE_ " + UUID( ) . uuidString. replacingOccurrences ( of: " - " , with: " " )
35
+ let t2 =
36
+ " \( ICEBERG_DATABASE) .TABLE_ " + UUID( ) . uuidString. replacingOccurrences ( of: " - " , with: " " )
36
37
37
38
let spark = try await SparkSession . builder. getOrCreate ( )
38
39
@@ -56,14 +57,103 @@ struct IcebergTests {
56
57
try await spark. table ( t1) . writeTo ( t2) . append ( )
57
58
#expect( try await spark. table ( t2) . count ( ) == 6 )
58
59
60
+ try await spark. sql ( " INSERT INTO \( t2) VALUES (1, 'a'), (2, 'b'), (3, 'c') " ) . count ( )
61
+ #expect( try await spark. table ( t2) . count ( ) == 9 )
62
+
59
63
try await spark. table ( t1) . writeTo ( t2) . replace ( )
60
64
#expect( try await spark. table ( t2) . count ( ) == 3 )
61
65
66
+ try await spark. sql ( " INSERT OVERWRITE \( t2) VALUES (1, 'a'), (2, 'b'), (3, 'c') " ) . count ( )
67
+ #expect( try await spark. table ( t2) . count ( ) == 3 )
68
+
69
+ try await spark. sql ( " DELETE FROM \( t2) WHERE id = 1 " ) . count ( )
70
+ #expect( try await spark. table ( t2) . count ( ) == 2 )
71
+
72
+ try await spark. sql ( " UPDATE \( t2) SET data = 'new' WHERE id = 2 " ) . count ( )
73
+ #expect( try await spark. sql ( " SELECT * FROM \( t2) WHERE data = 'new' " ) . count ( ) == 1 )
74
+
62
75
try await spark. table ( t1) . writeTo ( t2) . overwrite ( " true " )
63
76
#expect( try await spark. table ( t2) . count ( ) == 3 )
64
77
65
78
try await spark. table ( t1) . writeTo ( t2) . overwrite ( " false " )
66
79
#expect( try await spark. table ( t2) . count ( ) == 6 )
80
+
81
+ try await spark. sql ( " INSERT OVERWRITE \( t2) VALUES (1, 'a') " ) . count ( )
82
+ #expect( try await spark. table ( t2) . count ( ) == 1 )
83
+
84
+ try await spark. table ( t1) . writeTo ( t2) . overwrite ( " id = 1 " )
85
+ #expect( try await spark. table ( t2) . count ( ) == 3 )
86
+ } )
87
+
88
+ await spark. stop ( )
89
+ }
90
+
91
+ @Test
92
+ func partition( ) async throws {
93
+ guard icebergEnabled else { return }
94
+ let t1 =
95
+ " \( ICEBERG_DATABASE) .TABLE_ " + UUID( ) . uuidString. replacingOccurrences ( of: " - " , with: " " )
96
+ let t2 =
97
+ " \( ICEBERG_DATABASE) .TABLE_ " + UUID( ) . uuidString. replacingOccurrences ( of: " - " , with: " " )
98
+
99
+ let spark = try await SparkSession . builder. getOrCreate ( )
100
+
101
+ try await SQLHelper . withTable ( spark, t1, t2) ( {
102
+ try await spark. sql (
103
+ """
104
+ CREATE TABLE \( t1) (
105
+ id BIGINT,
106
+ data STRING,
107
+ category STRING)
108
+ USING ICEBERG
109
+ PARTITIONED BY (category)
110
+ """
111
+ ) . count ( )
112
+ try await spark. sql (
113
+ """
114
+ CREATE TABLE \( t2) (
115
+ id BIGINT,
116
+ data STRING,
117
+ category STRING)
118
+ USING ICEBERG
119
+ PARTITIONED BY (category)
120
+ """
121
+ ) . count ( )
122
+
123
+ #expect( try await spark. catalog. tableExists ( t1) )
124
+ #expect( try await spark. catalog. tableExists ( t2) )
125
+
126
+ #expect( try await spark. table ( t1) . count ( ) == 0 )
127
+ #expect( try await spark. table ( t2) . count ( ) == 0 )
128
+
129
+ try await spark. sql ( " INSERT INTO \( t1) VALUES (1, 'a', 'A'), (2, 'b', 'B'), (3, 'c', 'C') " )
130
+ . count ( )
131
+ #expect( try await spark. table ( t1) . count ( ) == 3 )
132
+ #expect( try await spark. table ( t2) . count ( ) == 0 )
133
+
134
+ try await spark. table ( t1) . writeTo ( t2) . append ( )
135
+ #expect( try await spark. table ( t2) . count ( ) == 3 )
136
+
137
+ try await spark. table ( t1) . writeTo ( t2) . replace ( )
138
+ #expect( try await spark. table ( t2) . count ( ) == 3 )
139
+
140
+ try await spark. sql ( " DELETE FROM \( t2) WHERE id = 1 " ) . count ( )
141
+ #expect( try await spark. table ( t2) . count ( ) == 2 )
142
+
143
+ try await spark. sql ( " UPDATE \( t2) SET data = 'new' WHERE id = 2 " ) . count ( )
144
+ #expect( try await spark. sql ( " SELECT * FROM \( t2) WHERE data = 'new' " ) . count ( ) == 1 )
145
+
146
+ try await spark. table ( t1) . writeTo ( t2) . overwritePartitions ( )
147
+ #expect( try await spark. table ( t2) . count ( ) == 3 )
148
+
149
+ try await spark. sql ( " INSERT OVERWRITE \( t2) SELECT * FROM \( t1) " ) . count ( )
150
+ #expect( try await spark. table ( t2) . count ( ) == 3 )
151
+
152
+ try await spark. sql ( " INSERT OVERWRITE \( t2) SELECT * FROM \( t1) WHERE category = 'C' " ) . count ( )
153
+ #expect( try await spark. table ( t2) . count ( ) == 1 )
154
+
155
+ try await spark. table ( t1) . writeTo ( t2) . overwrite ( " category = 'C' " )
156
+ #expect( try await spark. table ( t2) . count ( ) == 3 )
67
157
} )
68
158
69
159
await spark. stop ( )
0 commit comments