Spark SQL之External DataSource外部数据源(二)源码分析

上周Spark1.2刚发布,周末在家没事,把这个特性给了解一下,顺便分析下源码,看一看这个特性是如何设计及实现的。

    /** Spark SQL源码分析系列文章*/

  (Ps: External DataSource使用篇地址:Spark SQL之External DataSource外部数据源(一)示例 http://blog.csdn.net/oopsoom/article/details/42061077

一、Sources包核心

    Spark SQL在Spark1.2中提供了External DataSource API,开发者可以根据接口来实现自己的外部数据源,如avro, csv, json, parquet等等。

    在Spark SQL源代码的org/spark/sql/sources目录下,我们会看到关于External DataSource的相关代码。这里特别介绍几个:

    1、DDLParser 

    专门负责解析外部数据源SQL的SqlParser,解析create temporary table xxx using options (key 'value', key 'value') 创建加载外部数据源表的语句。

 

 
  1. protected lazy val createTable: Parser[LogicalPlan] =

  2. CREATE ~ TEMPORARY ~ TABLE ~> ident ~ (USING ~> className) ~ (OPTIONS ~> options) ^^ {

  3. case tableName ~ provider ~ opts =>

  4. CreateTableUsing(tableName, provider, opts)

  5. }

 

    2、CreateTableUsing

   一个RunnableCommand,通过反射从外部数据源lib中实例化Relation,然后注册到为temp table。

 

 
  1. private[sql] case class CreateTableUsing(

  2. tableName: String,

  3. provider: String, // org.apache.spark.sql.json

  4. options: Map[String, String]) extends RunnableCommand {

  5.  
  6. def run(sqlContext: SQLContext) = {

  7. val loader = Utils.getContextOrSparkClassLoader

  8. val clazz: Class[_] = try loader.loadClass(provider) catch { //do reflection

  9. case cnf: java.lang.ClassNotFoundException =>

  10. try loader.loadClass(provider + ".DefaultSource") catch {

  11. case cnf: java.lang.ClassNotFoundException =>

  12. sys.error(s"Failed to loa

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值