您的位置:首页 > 数据库

第68课:Spark SQL通过JDBC操作Sql Server

2016-05-23 00:00 405 查看
摘要: Spark学习

本期内容:

1 Spark SQL操作关系数据库的意义

2 Spark SQL操作关系数据库实战

一:使用Spark通过JDBC操作数据库

1, Spark SQL可以通过JDBC从传统的关系型数据库中读写数据,读取数据后直接生成的是DataFrame。然后再加上借助于Spark内核的丰富的API来进行各种操作。从计算数据规模的角度去讲,集群并行访问数据库数据;

2,通过format(“jdbc“)的方式说明SparkSQL操作的数据来源是通过JDBC获得,JDBC后端一般都是数据库,例如MySQL、Oracle等;

3,通过DataFrameReader的optition方法把要访问数据库的信息传递进去:

url:代表数据库的jdbc链接地址;

dbtable:具体要链接那个数据库;

driver:Driver部分是Spark SQL访问数据库的具体的驱动的完整包名和类名

4,关于JDBC的驱动的Jar,可以放在Spark的library目录,也可以在使用Spark Submit的使用指定具体的Jar(编码和打包的时候都不需要这个JDBC的Jar);

5,在实际的企业级开发环境中,如果数据中数据规模热别大,例如10亿条数据,此时采用传统的DB去处理的话一般需要对10亿条数据分成很多批次处理,例如分成100批(受限于单台Server的处理能力),且实际的处理过程可能会非常复杂,通过传统的Java EE等技术可能很难或者不方便实现处理算法,此时采用Spark SQL活得数据库中的数据并进行分布式处理就可以非常好的解决该问题,但是由于Spark SQL加载DB中的数据需要实践2,所以一般会在Spark SQL和具体要操作的DB之间加上一个缓冲层次,例如中间使用Redis,可以把Spark处理速度提高到甚至45倍;

6,关于写入数据库的操作,下图中的方法不可取;



a)当DataFrame要把通过Spark SQL、Core、ML等复杂操作后的数据写入数据库的时候首先是权限的问题,确保数据库授权了当前操作Spark SQL的用户;

b)DataFrame要写数据到DB的时候一般都不可以直接写进去,而是要转成RDD,通过RDD写数据到DB中,可以用foreachPartition(避免partiton每一条记录连一次数据库)

二、Spark SQL操作关系数据库实战(连的是SQL Server)

代码如下:

[code=language-scala]package IMF.sql

import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}

/**
* Created by hduser on 16-5-13.
* JDBC连接到SQL Server
*/
object s68_SparkSQLJDBC2SQLServer {

def main(args: Array[String]) {
val conf = new SparkConf()
.setAppName("SparkSQLJDBC2SQLServer")
.setMaster("local")
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
val sqlContext = new SQLContext(sc)

//需要先导入jar包,需要sqljdbc_4以上版本
val df_sqlServer = sqlContext.read.format("jdbc")
.option("url", "jdbc:sqlserver://***.***.***.***:1433")
.option("databaseName", "xxx")
.option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
.option("dbtable", "xxx")
.option("user", "sa")
.option("password", "xxx").load()
df_sqlServer.show(100)

//df_sqlServer.rdd.for

}
}
0
© OSChina.NET 使用条款 隐
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spark hadoop scala JDBC