Spark Sql 连接mysql

转载请务必注明原创地址为:http://dongkelun.com/2018/03/21/sparkMysql/

1、基本概念和用法(摘自spark官方文档中文版)

Spark SQL 还有一个能够使用 JDBC 从其他数据库读取数据的数据源。当使用 JDBC 访问其它数据库时,应该首选 JdbcRDD。这是因为结果是以数据框(DataFrame)返回的,且这样 Spark SQL操作轻松或便于连接其它数据源。因为这种 JDBC 数据源不需要用户提供 ClassTag,所以它也更适合使用 Java 或 Python 操作。(注意,这与允许其它应用使用 Spark SQL 执行查询操作的 Spark SQL JDBC 服务器是不同的)。

使用 JDBC 访问特定数据库时,需要在 spark classpath 上添加对应的 JDBC 驱动配置。例如,为了从 Spark Shell 连接 postgres,你需要运行如下命令 :

bin/spark-shell --driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar

通过调用数据源API,远程数据库的表可以被加载为DataFrame 或Spark SQL临时表。支持的参数有 :

属性名 | 含义

  • | :-: url | 要连接的 JDBC URL。 dbtable | 要读取的 JDBC 表。 注意,一个 SQL 查询的 From 分语句中的任何有效表都能被使用。例如,既可以是完整表名,也可以是括号括起来的子查询语句。 driver | 用于连接 URL 的 JDBC 驱动的类名。 partitionColumn, lowerBound, upperBound, numPartitions | 这几个选项,若有一个被配置,则必须全部配置。它们描述了当从多个 worker 中并行的读取表时,如何对它分区。partitionColumn 必须时所查询表的一个数值字段。注意,lowerBound 和 upperBound 都只是用于决定分区跨度的,而不是过滤表中的行。因此,表中的所有行将被分区并返回。 fetchSize | JDBC fetch size,决定每次读取多少行数据。 默认将它设为较小值(如,Oracle上设为 10)有助于 JDBC 驱动上的性能优化。2、scala代码实现连接mysql2.1 添加mysql 依赖在sbt 配置文件里添加:"mysql" % "mysql-connector-java" % "6.0.6"然后执行:sbt eclipse2.2 建表并初始化数据
DROP TABLE IF EXISTS `USER_T`;  
CREATE TABLE `USER_T` (  
  `ID` INT(11) NOT NULL,  
  `USER_NAME` VARCHAR(40) NOT NULL,  
  PRIMARY KEY (`ID`)  
) ENGINE=INNODB  DEFAULT CHARSET=UTF8;  
INSERT  INTO `USER_T`(`ID`,`USER_NAME`) VALUES (1,'测试1');
INSERT  INTO `USER_T`(`ID`,`USER_NAME`) VALUES (2,'测试2');

2.3 代码

2.3.1 查询

package com.dkl.leanring.spark.sql

import org.apache.spark.sql.SparkSession

/**
 * spark查询mysql测试
 */
object MysqlQueryDemo {

  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("MysqlQueryDemo").master("local").getOrCreate()
    val jdbcDF = spark.read
      .format("jdbc")
      .option("url", "jdbc:mysql://192.168.44.128:3306/hive?useUnicode=true&characterEncoding=utf-8")
      .option("dbtable", "USER_T")
      .option("user", "root")
      .option("password", "Root-123456")
      .load()
    jdbcDF.show()
  }
}

2.3.2 插入数据

新建USER_T.csv,造几条数据如图:

(需将csv的编码格式转为utf-8,否则spark读取中文乱码,转码方法见:https://jingyan.baidu.com/article/fea4511a092e53f7bb912528.html

package com.dkl.leanring.spark.sql

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.SaveMode
import java.util.Properties

/**
 * 从USER_T.csv读取数据并插入的mysql表中
 */
object MysqlInsertDemo {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("MysqlInsertDemo").master("local").getOrCreate()
    val df = spark.read.option("header", "true").csv("src/main/resources/scala/USER_T.csv")
    df.show()
    val url = "jdbc:mysql://192.168.44.128:3306/hive?useUnicode=true&characterEncoding=utf-8"
    val prop = new Properties()
    prop.put("user", "root")
    prop.put("password", "Root-123456")
    df.write.mode(SaveMode.Append).jdbc(url, "USER_T", prop)
  }
}

再查询一次,就会发现表里多了几条数据

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

查看SQL执行计划的方法及优劣

作者 | 胡佳伟:云和恩墨技术工程师,有多年数据库优化经验,在一线执行过多个包括通信、保险等行业的优化项目。

1112
来自专栏python成长之路

mysql在ubuntu中的操作笔记(详)

1624
来自专栏数据和云

执行计划:如何手工创建Profile维持SQL计划的稳定性

在上一篇:《执行计划:Oracle的Profile特性与SQL执行计划的稳定性》,向大家介绍了什么是 SQL Profiles 及其作用,如何使用 SQL Tu...

2934
来自专栏MySQL实战分享

MongoDB第四期:SQL 与 MongoDB 映射(入门)

传统的关系数据库一般由数据库、表、记录三个层次概念组成,MongoDB是由数据库、集合、文档对象三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没...

3562
来自专栏跟着阿笨一起玩NET

sql语句延时执行或者是指定时间执行

以下示例在晚上 10:20 (22:20) 执行存储过程 sp_update_job。

3721
来自专栏Albert陈凯

Hadoop数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过)离线数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过)

离线数据分析平台实战——130Hive Shell命令介绍 02(熟悉Hive略过) 导入数据 Hive的导入数据基本上可以分为三类, 第一种是从linux系...

2755
来自专栏自由而无用的灵魂的碎碎念

Oracle:创建db_link

global_name也就是数据库的全局数据库名,可已使用select * from global_name;查询:

862
来自专栏james大数据架构

微软官方提供的用于监控MS SQL Server运行状况的工具及SQL语句

Microsoft SQL Server 2005 提供了一些工具来监控数据库。方法之一是动态管理视图。动态管理视图 (DMV) 和动态管理函数 (DMF) 返...

2537
来自专栏数据之美

Hive 常见问题与技巧【Updating】

1Q: 是否有像类似于phpmyadmin一样的hive查询客户端,能以界面的方式查询hive语句和导出数据 A: 有的,客户端的话可以使用squirre...

2387
来自专栏杨建荣的学习笔记

关于自动化平台的动态菜单设计

最近几天是马不停蹄的做一些事情,今天计划把通用功能的部分先改进一些,比如说菜单的权限配置。目前使用的方案是用户可以看到所有的菜单,如果没有权限,则返回一个权限不...

4154

扫码关注云+社区

领取腾讯云代金券