spark通过jbdc连接MySQL

来源:互联网 发布:淘宝设置精品橱窗推荐 编辑:程序博客网 时间:2024/05/16 23:50

/*---------------------------------------------------------------------------------------------------------------------------------------------

文章目的: 记录以及梳理自己在spark中通过jdbc 连接mysql 过程的问题和方法

连接本来是不难的东西.  却兜兜转转好一阵. 主要问题出在:1. 经验不够  2.网上的资料版本过旧

这里我自己的spark版本是:  version 2.1.0  

Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_121) //Scala 版本 以及 JDK版本

---------------------------------------------------------------------------------------------------------------------------------------------*/

网上巨多资料 . 但是我觉得应该多看官网 因为 它会随着版本更新 而且比较可靠.  链接贴如下:

http://spark.apache.org/docs/latest/sql-programming-guide.html#datasets-and-dataframes

首先 你要知道你当初的下载的 JDBC 的jar 文件在哪.  假设在 /path 中 

为了    include the JDBC drive    应用如下命令开启 spark-shell

(假设你已经在  /spark 路径中  否则 spark-shell 路径自行调整)

./bin/spark-shell --driver-class-path /path/mysql-connectot-java-version-bin.jar --jars mysql-connectot-java-version-bin.jar

//具体文件名称请 Tab 大法补全   按理说肯定有更简单的让自动加载的方法  我再找找

//试了一下发现这句不设置也可以...估计是之前已经把 这个jar包放到了 JDK中都 jre内都缘故

接下来介绍一些重要 参数. 详细的请官网  的 JDBC To Other Databases 部分看

url
The JDBC URL to connect to. The source-specific connection properties may be specified in the URL. e.g., 

jdbc:postgresql://localhost/test?user=fred&password=secret


dbtable

The JDBC table that should be read. Note that anything that is valid in a FROM clause of a SQL query can be used. For example, instead of a full table you could also use a subquery in parentheses.


好了 接下来直接进入连接部分.   (  Scala 语言描述 其它的看官网 )

// Note: JDBC loading and saving can be achieved via either the load/save or jdbc methods
// Loading data from a JDBC source
val jdbcDF = spark.read//第一种方式
  .format("jdbc")
  .option("url", "jdbc:mysql:dbserver")
  .option("dbtable", "schema.tablename") //注意这里不是写 schema.tablename  我是写tablename才通过的
  .option("user", "username")
  .option("password", "password")
  .load()



val connectionProperties = new Properties()//第二种方式  上下两种read方式你选一种就行
connectionProperties.put("user", "username") //但是要注意第二种方式可能出现Properties无法识别
connectionProperties.put("password", "password") //遇到类似情况直接 import相应类  如此处为 import java.util.Properties;
val jdbcDF2 = spark.read
  .jdbc("jdbc:mysql:dbserver", "schema.tablename", connectionProperties)



// Saving data to a JDBC source
jdbcDF.write //第一种方式写
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .save()



jdbcDF2.write //第二种方式写  用到了前面读读 connectionProperties
 .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)


再次提醒:    
val jdbcDF2 = spark.read
  .jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)

这一段中 "schema.tablename" 并非  "schema."+"yourTableName"的意思,schema应该是别的更细节说明, 这一整个字符串直接填你想操作的表名就可以
另:   url字段和我记录的这篇文章格式一致 . 粗略粘贴如下:
jdbc:mysql :// [hostname] [:port] / [dbname] [?param1=value1] [&param2=value2]…

再具体:

 jdbc:mysql: //localhost:3306 /your_DbName?user=root&password=your_password
接下来你就得到了  jdbcDF这样一个 dataFrame 实例了... 然后就可以参考官网的一些说明对它操作了
比如可以试试  jdbcDF.show();  等等...



实现SQL语句操作:
使用Scala中API进行操作
import java.sql.DriverManager;
val url=" jdbc:mysql://localhost:3306/dbName?useSSL=false&user=root&password=yourPassword"
val conn=DriverManager.getConnection(url);
val prep=conn.prepareStatement("INSERT INTO tableName VALUES( ... )");
prep.executeUpdate;      //或者直接  conn.prepareStatement("INSERT INTO tableName VALUES( ... )").executeUpdate;

也可以使用下列利用JAVA API 进行操作
import java.sql.Statement;
val statement=conn.createStatement(); //具体操作可以参考mysql 语法了
val resultSet=statement.executeQuery("SELECT * FROM tableName");
while(resultSet.next()){
val id=resultSet.getInt("id"):
val name=resultSet.getString("name");
pringln("id,name="+id+" "+name);
}


                                             
0 0
原创粉丝点击