文章目录
要定义一个外部数据源可以参考
JDBCrelation和JDBCrelationprovider。
JDBCrelation相当于用户可以使用里面的方法实现数据select,过滤和插入。
JDBCrelationprovider相当于用户和JDBCrelation的中转站,解析用户传入的参数。
JDBCrelationprovider
createrelation可以接受用户参数,调用JDBCrelation
模仿JDBCrelationprovider
package sql04.text
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.sources.{BaseRelation, RelationProvider, SchemaRelationProvider}
import org.apache.spark.sql.types.StructType
//jdbcrelationprovider
//必须叫DefaultSource,不然调用报错
//schemarelationprovider可以让用户传入schema
class DefaultSource extends RelationProvider with SchemaRelationProvider{
def createRelation(
sqlContext: SQLContext,
parameters: Map[String, String],
schema: StructType): BaseRelation = {
//读文件就要path
val path = parameters.get("path")
path match {
case Some(x) => new TextDatasourceRelation(sqlContext, x, schema)
case _ => throw new IllegalArgumentException("path is required for custom-text-datasource-api")
}
}
override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = {
createRelation(sqlContext,parameters,null)
}
}
这里继承的RelationProvider和SchemaRelationProvider区别在于,schemarelationprovider可以接受schema码。
注意,这里的类名要是DefaultSource。
JDBCrelation
可以看出JDBCRelation继承自Baserelation,PrunedFilteredScan,InsertableRelation
Baserelation
定义了schema信息,相当于StructType
PrunedFilteredScan
用户可以做行过滤和列裁剪
select a,b,c from stu