[SPARK-24691][SQL] Dispatch the type support check in FileFormat implementation
[spark.git] / sql / core / src / main / scala / org / apache / spark / sql / execution / datasources / DataSourceUtils.scala
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *    http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 package org.apache.spark.sql.execution.datasources
19
20 import org.apache.spark.sql.AnalysisException
21 import org.apache.spark.sql.types._
22
23
24 object DataSourceUtils {
25
26   /**
27    * Verify if the schema is supported in datasource in write path.
28    */
29   def verifyWriteSchema(format: FileFormat, schema: StructType): Unit = {
30     verifySchema(format, schema, isReadPath = false)
31   }
32
33   /**
34    * Verify if the schema is supported in datasource in read path.
35    */
36   def verifyReadSchema(format: FileFormat, schema: StructType): Unit = {
37     verifySchema(format, schema, isReadPath = true)
38   }
39
40   /**
41    * Verify if the schema is supported in datasource. This verification should be done
42    * in a driver side.
43    */
44   private def verifySchema(format: FileFormat, schema: StructType, isReadPath: Boolean): Unit = {
45     schema.foreach { field =>
46       if (!format.supportDataType(field.dataType, isReadPath)) {
47         throw new AnalysisException(
48           s"$format data source does not support ${field.dataType.simpleString} data type.")
49       }
50     }
51   }
52 }