实现一个外部数据源

本文介绍了如何实现Spark外部数据源,主要涉及JDBCrelation和JDBCrelationprovider的模仿。JDBCrelationprovider作为用户与JDBCrelation之间的桥梁,用于解析用户参数。JDBCrelation则实现了数据的select、过滤和插入操作。此外,详细讲解了如何继承Baserelation、PrunedFilteredScan等接口以支持不同操作,并且提到了Utils.castTo方法在类型转换中的作用。最后,阐述了如何将实现的外部数据源提交到Spark执行。
摘要由CSDN通过智能技术生成

要定义一个外部数据源可以参考
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值