博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spark中访问数据库多种方式(遇到坑)
阅读量:2058 次
发布时间:2019-04-29

本文共 2817 字,大约阅读时间需要 9 分钟。

问题描述:

1在IDEA中使用scala语言在spark环境中访问postgres数据库,执行相应的sql语句,返回相应的结果.

自身在访问数据库中遇到了很多的坑,就尝试多种方式,如下:


一.官方提供了2种使用JDBC接口的方法。

1.1方式一(使用sparkSession方式):

使用DataFrameReader 类提供的jdbc(url,tbname,conn)方法从指定数据库读取数据

//获取spark的连接val session = SparkSession.builder()      .master("local")      .appName(JDBCDemo.getClass.getSimpleName)      .getOrCreate()val driver:String = "org.postgresql.Driver"val url = "jdbc:postgresql://localhost:5432/postgres"val tbname = "products"Properties conn = new Properties();//增加数据库的用户名(user)密码(password),指定postgresql驱动(driver)conn .put("user","postgres");conn .put("password","123456");conn .put("driver",driver);//SparkJdbc读取Postgresql的products表内容val jdbcDF = session.read().format("jdbc").jdbc(url ,tbname ,conn );//因为这种方式中这是方式format("jdbc")可以省略jdbcDF.show();//显示jdbcDF数据内容

说明:其中spark是指SparkSession对象,如不明白请上网查询

1.2方式二(使用sparkSession方式):

使用DataFrameReader 类提供的【options()方法+ load()方法】方法从指定数据库读取数据,

#format("jdbc")代表使用jdbc方式访问数据库val load:Dataset
= session.read().format("jdbc") .option("url", "jdbc:postgresql:dbserver") .option("dbtable", "schema.tablename") #要访问的具体的表.option("user", "username") #操作该数据库的用户名.option("password", "password") #操作该数据库的用户密码.load();//或者等价于==/* val load:Dataset[Row] = session.read.format("jdbc").options( Map("url" -> url, "dbtable" -> tname, "user" -> "postgres", "password" -> "postgres", "driver" -> driver ) ).load()*/session.close()

其中://url的格式是jdbc:postgresql://数据库IP:端口号/数据库名称;其中session是指SparkSession对象

1.3 写入数据到数据库中

提示:下面代码中的read表示DataFrame[Row]类型的对象;

//写入数据库的(第一种)方法(此方法是默认模式(存在该表就直接报错)) //调用jdbc方法,方法里面的参数第一个是定义的url数据库连接,第二个是表名,第三个是Properties类的实例化对象(我们命名为conn)load.write.jdbc(url, "tableX", conn) //写入数据库的(第二种)方法:调用mode方法并传入 SaveMode.Append 参数  (就是存在该表的情况下就直接在表后面追加) load.write.mode(SaveMode.Append).jdbc(url, "tableX", conn) //写入数据库(第三种)方式,调用mode方法并传入 SaveMode.Overwrite 参数 (吐过存在该表的情况下 覆盖里面的数据) load.write.mode(SaveMode.Overwrite).jdbc(url, "tableX", conn)

二、使用java访问

2.1方式三:(使用java访问)

val conn_str = "jdbc:postgresql://IP地址:端口号/数据库名称"classOf[com.mysql.jdbc.Driver]  // 使用上一句可能会有warning,因为这是一个表达式,可以换成下面的// Class.forName("org.postgresql.Driver").newInstanceval conn = DriverManager.getConnection(conn_str, "用户名称", "密码")val conn = DriverManager.getConnection(conn_str)try {      // Configure to be Read Only      val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)     // Execute Query      val rs = statement.executeQuery("SELECT quote FROM quotes LIMIT 5")     // Iterate Over ResultSet     while (rs.next) {       println(rs.getString("quote"))     }  }  finally {      conn.close    }

提示:应为java在scala开发环境中式完全兼容的(运行在java的JVM中),因此使用掺杂使用java方式访问数据库式是完全合法的。但是建议使用scala与spark原生的方式访问数据库。

案例:

(SPark SQL 从 DB 读取数据方法和方式 scala)


(未完待续……..)

转载地址:http://srvlf.baihongyu.com/

你可能感兴趣的文章
macOS Big Sur 使用全新虚拟化框架创建超轻量虚拟机!
查看>>
16 岁高中生成功在 iPhone 7 上安装 Ubuntu 20.04 桌面!
查看>>
两个程序都要用同一个端口,怎么解?
查看>>
有了这款图形管理界面,一分钟内配置 10 个 WireGuard 客户端不是梦
查看>>
Containerd镜像lazy-pulling解读
查看>>
Grafana 教程 - 构建你的第一个仪表盘
查看>>
由 OOM 引发的 ext4 文件系统卡死
查看>>
什么?WireGuard 可以让躲在 NAT 后面的客户端之间直连了??
查看>>
k8s集群内的节点,可能没你想象的那么健壮!(磁盘管理篇)
查看>>
利用 ebpf sockmap/redirection 提升 socket 性能(2020)
查看>>
春节前最后一波福利,Alibaba Java 训练营]5天突破面向对象编程限时免费报名!...
查看>>
我就要在容器里写文件!?
查看>>
支付宝集五福最全攻略,五分钟集齐五福!
查看>>
Runc 容器初始化和容器逃逸
查看>>
使用 GDB + Qemu 调试 Linux 内核
查看>>
介绍一个小工具:SSL-exporter
查看>>
深入理解 tc ebpf 的 direct-action (da) 模式(2020)
查看>>
为容器时代设计的高级 eBPF 内核特性(FOSDEM, 2021)
查看>>
Loki系列文章
查看>>
字节跳动面试官问:微服务下如何保证分布式事务的最终一致性?
查看>>