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)
代码如下:
[mw_shl_code=scala,true]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
}
}[/mw_shl_code]
来自:
https://my.oschina.net/bindyy/blog/680195
|