@@ -151,209 +151,203 @@ class HiveUDFSuite extends QueryTest with TestHiveSingleton with SQLTestUtils {
151
151
}
152
152
153
153
test(" UDFIntegerToString" ) {
154
- withTempTable( " integerTable " ) {
155
- val testData = hiveContext.sparkContext.parallelize(
156
- IntegerCaseClass ( 1 ) :: IntegerCaseClass ( 2 ) :: Nil ).toDF( )
157
- testData.registerTempTable( " integerTable " )
158
-
159
- val udfName = classOf [ UDFIntegerToString ].getName
160
- sql( s " CREATE TEMPORARY FUNCTION testUDFIntegerToString AS ' $udfName ' " )
161
- checkAnswer(
162
- sql( " SELECT testUDFIntegerToString(i) FROM integerTable " ),
163
- Seq ( Row ( " 1 " ), Row ( " 2 " )) )
164
- sql( " DROP TEMPORARY FUNCTION IF EXISTS testUDFIntegerToString " )
165
- }
154
+ val testData = hiveContext.sparkContext.parallelize(
155
+ IntegerCaseClass ( 1 ) :: IntegerCaseClass ( 2 ) :: Nil ).toDF()
156
+ testData.registerTempTable( " integerTable " )
157
+
158
+ val udfName = classOf [ UDFIntegerToString ].getName
159
+ sql( s " CREATE TEMPORARY FUNCTION testUDFIntegerToString AS ' $udfName ' " )
160
+ checkAnswer(
161
+ sql( " SELECT testUDFIntegerToString(i) FROM integerTable " ),
162
+ Seq ( Row ( " 1 " ), Row ( " 2 " )))
163
+ sql( " DROP TEMPORARY FUNCTION IF EXISTS testUDFIntegerToString " )
164
+
165
+ hiveContext.reset()
166
166
}
167
167
168
168
test(" UDFToListString" ) {
169
- withTempTable(" inputTable" ) {
170
- val testData = hiveContext.sparkContext.parallelize(StringCaseClass (" " ) :: Nil ).toDF()
171
- testData.registerTempTable(" inputTable" )
172
-
173
- sql(s " CREATE TEMPORARY FUNCTION testUDFToListString AS ' ${classOf [UDFToListString ].getName}' " )
174
- val errMsg = intercept[AnalysisException ] {
175
- sql(" SELECT testUDFToListString(s) FROM inputTable" )
176
- }
177
- assert(errMsg.getMessage contains " List type in java is unsupported because " +
178
- " JVM type erasure makes spark fail to catch a component type in List<>;" )
179
-
180
- sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFToListString" )
169
+ val testData = hiveContext.sparkContext.parallelize(StringCaseClass (" " ) :: Nil ).toDF()
170
+ testData.registerTempTable(" inputTable" )
171
+
172
+ sql(s " CREATE TEMPORARY FUNCTION testUDFToListString AS ' ${classOf [UDFToListString ].getName}' " )
173
+ val errMsg = intercept[AnalysisException ] {
174
+ sql(" SELECT testUDFToListString(s) FROM inputTable" )
181
175
}
176
+ assert(errMsg.getMessage contains " List type in java is unsupported because " +
177
+ " JVM type erasure makes spark fail to catch a component type in List<>;" )
178
+
179
+ sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFToListString" )
180
+ hiveContext.reset()
182
181
}
183
182
184
183
test(" UDFToListInt" ) {
185
- withTempTable(" inputTable" ) {
186
- val testData = hiveContext.sparkContext.parallelize(StringCaseClass (" " ) :: Nil ).toDF()
187
- testData.registerTempTable(" inputTable" )
188
-
189
- sql(s " CREATE TEMPORARY FUNCTION testUDFToListInt AS ' ${classOf [UDFToListInt ].getName}' " )
190
- val errMsg = intercept[AnalysisException ] {
191
- sql(" SELECT testUDFToListInt(s) FROM inputTable" )
192
- }
193
- assert(errMsg.getMessage contains " List type in java is unsupported because " +
194
- " JVM type erasure makes spark fail to catch a component type in List<>;" )
195
-
196
- sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFToListInt" )
184
+ val testData = hiveContext.sparkContext.parallelize(StringCaseClass (" " ) :: Nil ).toDF()
185
+ testData.registerTempTable(" inputTable" )
186
+
187
+ sql(s " CREATE TEMPORARY FUNCTION testUDFToListInt AS ' ${classOf [UDFToListInt ].getName}' " )
188
+ val errMsg = intercept[AnalysisException ] {
189
+ sql(" SELECT testUDFToListInt(s) FROM inputTable" )
197
190
}
191
+ assert(errMsg.getMessage contains " List type in java is unsupported because " +
192
+ " JVM type erasure makes spark fail to catch a component type in List<>;" )
193
+
194
+ sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFToListInt" )
195
+ hiveContext.reset()
198
196
}
199
197
200
198
test(" UDFToStringIntMap" ) {
201
- withTempTable(" inputTable" ) {
202
- val testData = hiveContext.sparkContext.parallelize(StringCaseClass (" " ) :: Nil ).toDF()
203
- testData.registerTempTable(" inputTable" )
204
-
205
- sql(s " CREATE TEMPORARY FUNCTION testUDFToStringIntMap " +
206
- s " AS ' ${classOf [UDFToStringIntMap ].getName}' " )
207
- val errMsg = intercept[AnalysisException ] {
208
- sql(" SELECT testUDFToStringIntMap(s) FROM inputTable" )
209
- }
210
- assert(errMsg.getMessage contains " Map type in java is unsupported because " +
211
- " JVM type erasure makes spark fail to catch key and value types in Map<>;" )
212
-
213
- sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFToStringIntMap" )
199
+ val testData = hiveContext.sparkContext.parallelize(StringCaseClass (" " ) :: Nil ).toDF()
200
+ testData.registerTempTable(" inputTable" )
201
+
202
+ sql(s " CREATE TEMPORARY FUNCTION testUDFToStringIntMap " +
203
+ s " AS ' ${classOf [UDFToStringIntMap ].getName}' " )
204
+ val errMsg = intercept[AnalysisException ] {
205
+ sql(" SELECT testUDFToStringIntMap(s) FROM inputTable" )
214
206
}
207
+ assert(errMsg.getMessage contains " Map type in java is unsupported because " +
208
+ " JVM type erasure makes spark fail to catch key and value types in Map<>;" )
209
+
210
+ sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFToStringIntMap" )
211
+ hiveContext.reset()
215
212
}
216
213
217
214
test(" UDFToIntIntMap" ) {
218
- withTempTable(" inputTable" ) {
219
- val testData = hiveContext.sparkContext.parallelize(StringCaseClass (" " ) :: Nil ).toDF()
220
- testData.registerTempTable(" inputTable" )
221
-
222
- sql(s " CREATE TEMPORARY FUNCTION testUDFToIntIntMap " +
223
- s " AS ' ${classOf [UDFToIntIntMap ].getName}' " )
224
- val errMsg = intercept[AnalysisException ] {
225
- sql(" SELECT testUDFToIntIntMap(s) FROM inputTable" )
226
- }
227
- assert(errMsg.getMessage contains " Map type in java is unsupported because " +
228
- " JVM type erasure makes spark fail to catch key and value types in Map<>;" )
229
-
230
- sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFToIntIntMap" )
215
+ val testData = hiveContext.sparkContext.parallelize(StringCaseClass (" " ) :: Nil ).toDF()
216
+ testData.registerTempTable(" inputTable" )
217
+
218
+ sql(s " CREATE TEMPORARY FUNCTION testUDFToIntIntMap " +
219
+ s " AS ' ${classOf [UDFToIntIntMap ].getName}' " )
220
+ val errMsg = intercept[AnalysisException ] {
221
+ sql(" SELECT testUDFToIntIntMap(s) FROM inputTable" )
231
222
}
223
+ assert(errMsg.getMessage contains " Map type in java is unsupported because " +
224
+ " JVM type erasure makes spark fail to catch key and value types in Map<>;" )
225
+
226
+ sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFToIntIntMap" )
227
+ hiveContext.reset()
232
228
}
233
229
234
230
test(" UDFListListInt" ) {
235
- withTempTable( " listListIntTable " ) {
236
- val testData = hiveContext.sparkContext.parallelize(
237
- ListListIntCaseClass (Nil ) ::
238
- ListListIntCaseClass (Seq ((1 , 2 , 3 ))) ::
239
- ListListIntCaseClass ( Seq (( 4 , 5 , 6 ), ( 7 , 8 , 9 ))) :: Nil ).toDF( )
240
- testData.registerTempTable( " listListIntTable " )
241
-
242
- sql( s " CREATE TEMPORARY FUNCTION testUDFListListInt AS ' ${ classOf [ UDFListListInt ].getName} ' " )
243
- checkAnswer(
244
- sql( " SELECT testUDFListListInt(lli) FROM listListIntTable " ),
245
- Seq ( Row ( 0 ), Row ( 2 ), Row ( 13 )) )
246
- sql( " DROP TEMPORARY FUNCTION IF EXISTS testUDFListListInt " )
247
- }
231
+ val testData = hiveContext.sparkContext.parallelize(
232
+ ListListIntCaseClass ( Nil ) ::
233
+ ListListIntCaseClass (Seq (( 1 , 2 , 3 )) ) ::
234
+ ListListIntCaseClass (Seq ((4 , 5 , 6 ), ( 7 , 8 , 9 ))) :: Nil ).toDF()
235
+ testData.registerTempTable( " listListIntTable " )
236
+
237
+ sql( s " CREATE TEMPORARY FUNCTION testUDFListListInt AS ' ${ classOf [ UDFListListInt ].getName} ' " )
238
+ checkAnswer(
239
+ sql( " SELECT testUDFListListInt(lli) FROM listListIntTable " ),
240
+ Seq ( Row ( 0 ), Row ( 2 ), Row ( 13 )))
241
+ sql( " DROP TEMPORARY FUNCTION IF EXISTS testUDFListListInt " )
242
+
243
+ hiveContext.reset()
248
244
}
249
245
250
246
test(" UDFListString" ) {
251
- withTempTable( " listStringTable " ) {
252
- val testData = hiveContext.sparkContext.parallelize(
253
- ListStringCaseClass (Seq (" a " , " b " , " c " )) ::
254
- ListStringCaseClass ( Seq ( " d " , " e " )) :: Nil ).toDF( )
255
- testData.registerTempTable( " listStringTable " )
256
-
257
- sql( s " CREATE TEMPORARY FUNCTION testUDFListString AS ' ${ classOf [ UDFListString ].getName} ' " )
258
- checkAnswer(
259
- sql( " SELECT testUDFListString(l) FROM listStringTable " ),
260
- Seq ( Row ( " a,b,c " ), Row ( " d,e " )) )
261
- sql( " DROP TEMPORARY FUNCTION IF EXISTS testUDFListString " )
262
- }
247
+ val testData = hiveContext.sparkContext.parallelize(
248
+ ListStringCaseClass ( Seq ( " a " , " b " , " c " )) ::
249
+ ListStringCaseClass (Seq (" d " , " e " )) :: Nil ).toDF()
250
+ testData.registerTempTable( " listStringTable " )
251
+
252
+ sql( s " CREATE TEMPORARY FUNCTION testUDFListString AS ' ${ classOf [ UDFListString ].getName} ' " )
253
+ checkAnswer(
254
+ sql( " SELECT testUDFListString(l) FROM listStringTable " ),
255
+ Seq ( Row ( " a,b,c " ), Row ( " d,e " )))
256
+ sql( " DROP TEMPORARY FUNCTION IF EXISTS testUDFListString " )
257
+
258
+ hiveContext.reset()
263
259
}
264
260
265
261
test(" UDFStringString" ) {
266
- withTempTable(" stringTable" ) {
267
- val testData = hiveContext.sparkContext.parallelize(
268
- StringCaseClass (" world" ) :: StringCaseClass (" goodbye" ) :: Nil ).toDF()
269
- testData.registerTempTable(" stringTable" )
262
+ val testData = hiveContext.sparkContext.parallelize(
263
+ StringCaseClass (" world" ) :: StringCaseClass (" goodbye" ) :: Nil ).toDF()
264
+ testData.registerTempTable(" stringTable" )
270
265
271
- sql(s " CREATE TEMPORARY FUNCTION testStringStringUDF AS ' ${classOf [UDFStringString ].getName}' " )
272
- checkAnswer(
273
- sql(" SELECT testStringStringUDF(\" hello\" , s) FROM stringTable" ),
274
- Seq (Row (" hello world" ), Row (" hello goodbye" )))
266
+ sql(s " CREATE TEMPORARY FUNCTION testStringStringUDF AS ' ${classOf [UDFStringString ].getName}' " )
267
+ checkAnswer(
268
+ sql(" SELECT testStringStringUDF(\" hello\" , s) FROM stringTable" ),
269
+ Seq (Row (" hello world" ), Row (" hello goodbye" )))
275
270
276
- checkAnswer(
277
- sql(" SELECT testStringStringUDF(\"\" , testStringStringUDF(\" hello\" , s)) FROM stringTable" ),
278
- Seq (Row (" hello world" ), Row (" hello goodbye" )))
271
+ checkAnswer(
272
+ sql(" SELECT testStringStringUDF(\"\" , testStringStringUDF(\" hello\" , s)) FROM stringTable" ),
273
+ Seq (Row (" hello world" ), Row (" hello goodbye" )))
279
274
280
- sql(" DROP TEMPORARY FUNCTION IF EXISTS testStringStringUDF" )
281
- }
275
+ sql(" DROP TEMPORARY FUNCTION IF EXISTS testStringStringUDF" )
276
+
277
+ hiveContext.reset()
282
278
}
283
279
284
280
test(" UDFTwoListList" ) {
285
- withTempTable(" TwoListTable" ) {
286
- val testData = hiveContext.sparkContext.parallelize(
287
- ListListIntCaseClass (Nil ) ::
288
- ListListIntCaseClass (Seq ((1 , 2 , 3 ))) ::
289
- ListListIntCaseClass (Seq ((4 , 5 , 6 ), (7 , 8 , 9 ))) ::
290
- Nil ).toDF()
291
- testData.registerTempTable(" TwoListTable" )
281
+ val testData = hiveContext.sparkContext.parallelize(
282
+ ListListIntCaseClass (Nil ) ::
283
+ ListListIntCaseClass (Seq ((1 , 2 , 3 ))) ::
284
+ ListListIntCaseClass (Seq ((4 , 5 , 6 ), (7 , 8 , 9 ))) ::
285
+ Nil ).toDF()
286
+ testData.registerTempTable(" TwoListTable" )
287
+
288
+ sql(s " CREATE TEMPORARY FUNCTION testUDFTwoListList AS ' ${classOf [UDFTwoListList ].getName}' " )
289
+ checkAnswer(
290
+ sql(" SELECT testUDFTwoListList(lli, lli) FROM TwoListTable" ),
291
+ Seq (Row (" 0, 0" ), Row (" 2, 2" ), Row (" 13, 13" )))
292
+ sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFTwoListList" )
293
+
294
+ hiveContext.reset()
295
+ }
292
296
297
+ test(" Hive UDFs with insufficient number of input arguments should trigger an analysis error" ) {
298
+ Seq ((1 , 2 )).toDF(" a" , " b" ).registerTempTable(" testUDF" )
299
+
300
+ {
301
+ // HiveSimpleUDF
293
302
sql(s " CREATE TEMPORARY FUNCTION testUDFTwoListList AS ' ${classOf [UDFTwoListList ].getName}' " )
294
- checkAnswer(
295
- sql(" SELECT testUDFTwoListList(lli, lli) FROM TwoListTable" ),
296
- Seq (Row (" 0, 0" ), Row (" 2, 2" ), Row (" 13, 13" )))
303
+ val message = intercept[AnalysisException ] {
304
+ sql(" SELECT testUDFTwoListList() FROM testUDF" )
305
+ }.getMessage
306
+ assert(message.contains(" No handler for Hive udf" ))
297
307
sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFTwoListList" )
298
308
}
299
- }
300
309
301
- test(" Hive UDFs with insufficient number of input arguments should trigger an analysis error" ) {
302
- withTempTable(" testUDF" ) {
303
- Seq ((1 , 2 )).toDF(" a" , " b" ).registerTempTable(" testUDF" )
304
-
305
- {
306
- // HiveSimpleUDF
307
- sql(s " CREATE TEMPORARY FUNCTION testUDFTwoListList AS ' ${classOf [UDFTwoListList ].getName}' " )
308
- val message = intercept[AnalysisException ] {
309
- sql(" SELECT testUDFTwoListList() FROM testUDF" )
310
- }.getMessage
311
- assert(message.contains(" No handler for Hive udf" ))
312
- sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFTwoListList" )
313
- }
314
-
315
- {
316
- // HiveGenericUDF
317
- sql(s " CREATE TEMPORARY FUNCTION testUDFAnd AS ' ${classOf [GenericUDFOPAnd ].getName}' " )
318
- val message = intercept[AnalysisException ] {
319
- sql(" SELECT testUDFAnd() FROM testUDF" )
320
- }.getMessage
321
- assert(message.contains(" No handler for Hive udf" ))
322
- sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFAnd" )
323
- }
324
-
325
- {
326
- // Hive UDAF
327
- sql(s " CREATE TEMPORARY FUNCTION testUDAFPercentile AS ' ${classOf [UDAFPercentile ].getName}' " )
328
- val message = intercept[AnalysisException ] {
329
- sql(" SELECT testUDAFPercentile(a) FROM testUDF GROUP BY b" )
330
- }.getMessage
331
- assert(message.contains(" No handler for Hive udf" ))
332
- sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDAFPercentile" )
333
- }
334
-
335
- {
336
- // AbstractGenericUDAFResolver
337
- sql(s " CREATE TEMPORARY " +
338
- s " FUNCTION testUDAFAverage AS ' ${classOf [GenericUDAFAverage ].getName}' " )
339
- val message = intercept[AnalysisException ] {
340
- sql(" SELECT testUDAFAverage() FROM testUDF GROUP BY b" )
341
- }.getMessage
342
- assert(message.contains(" No handler for Hive udf" ))
343
- sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDAFAverage" )
344
- }
345
-
346
- {
347
- // Hive UDTF
348
- sql(s " CREATE TEMPORARY " +
349
- s " FUNCTION testUDTFExplode AS ' ${classOf [GenericUDTFExplode ].getName}' " )
350
- val message = intercept[AnalysisException ] {
351
- sql(" SELECT testUDTFExplode() FROM testUDF" )
352
- }.getMessage
353
- assert(message.contains(" No handler for Hive udf" ))
354
- sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDTFExplode" )
355
- }
310
+ {
311
+ // HiveGenericUDF
312
+ sql(s " CREATE TEMPORARY FUNCTION testUDFAnd AS ' ${classOf [GenericUDFOPAnd ].getName}' " )
313
+ val message = intercept[AnalysisException ] {
314
+ sql(" SELECT testUDFAnd() FROM testUDF" )
315
+ }.getMessage
316
+ assert(message.contains(" No handler for Hive udf" ))
317
+ sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDFAnd" )
318
+ }
319
+
320
+ {
321
+ // Hive UDAF
322
+ sql(s " CREATE TEMPORARY FUNCTION testUDAFPercentile AS ' ${classOf [UDAFPercentile ].getName}' " )
323
+ val message = intercept[AnalysisException ] {
324
+ sql(" SELECT testUDAFPercentile(a) FROM testUDF GROUP BY b" )
325
+ }.getMessage
326
+ assert(message.contains(" No handler for Hive udf" ))
327
+ sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDAFPercentile" )
356
328
}
329
+
330
+ {
331
+ // AbstractGenericUDAFResolver
332
+ sql(s " CREATE TEMPORARY FUNCTION testUDAFAverage AS ' ${classOf [GenericUDAFAverage ].getName}' " )
333
+ val message = intercept[AnalysisException ] {
334
+ sql(" SELECT testUDAFAverage() FROM testUDF GROUP BY b" )
335
+ }.getMessage
336
+ assert(message.contains(" No handler for Hive udf" ))
337
+ sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDAFAverage" )
338
+ }
339
+
340
+ {
341
+ // Hive UDTF
342
+ sql(s " CREATE TEMPORARY FUNCTION testUDTFExplode AS ' ${classOf [GenericUDTFExplode ].getName}' " )
343
+ val message = intercept[AnalysisException ] {
344
+ sql(" SELECT testUDTFExplode() FROM testUDF" )
345
+ }.getMessage
346
+ assert(message.contains(" No handler for Hive udf" ))
347
+ sql(" DROP TEMPORARY FUNCTION IF EXISTS testUDTFExplode" )
348
+ }
349
+
350
+ sqlContext.dropTempTable(" testUDF" )
357
351
}
358
352
359
353
test(" Hive UDF in group by" ) {
0 commit comments