SparkSQL专门为读取HDFS上的文件开的外部数据源接口,spark-parquet、csv、json等都是这种方式。
DefaultSource
入口类,用来建立外部数据源连接,SparkSQL默认会找这个名字,不要改类名。基本所有接口都在这个类里
private[tsfile] class DefaultSource extends FileFormat with DataSourceRegister {
class TSFileDataSourceException(message: String, cause: Throwable)
extends Exception(message, cause) {
def this(message: String) = this(message, null)
}
override def equals(other: Any): Boolean = other match {
case _: DefaultSource => true
case _ => false
}
inferSchema接口
返回文件对应的表结构
参数说明:
files是连接的文件,返回SparkSQL的一张表结构。
用xxx代表文件后缀,不同用法对应不同的参数:
- 通配符指定路径
read.xxx("hdfs:///data/*/*.xxx")
这时files中包括所有匹配到的文件
- 指定文件夹
read.xxx("hdfs:///data/")
这时files中会包括/data文件夹下的所有文件
- 指定文件
read.xxx("hdfs:///data/a.xxx")
这时files中就只有一个a.xxx文件
//返回表结构,StrucType里包含StructField的list,每个StructField是一列
override def inferSchema(
spark: SparkSession,
options: Map[String, String],
files: Seq[FileStatus]): Option[StructType] = {
val conf = spark.sparkContext.