spark读取和存储jdbc数据库

在使用Spark原生save()方法存储MySQL数据时,遇到表被删除并重建为Longtext类型且无主键的问题。解决方案是通过Spark的load()方法读取MySQL表,转化为DataFrame,然后利用jdbc提供的方法进行存储。在存储过程中要注意使用Object类型处理数据以避免类型转换问题,支持overwrite、append、upsert三种模式。
摘要由CSDN通过智能技术生成

使用spark原生的save()方式存储MySQL表会出现以下问题。
1.如果用overwrite存储方式,会把mysql中要存储的表删除掉,新建一张表。于是出现了每个字符类型为Longtext类型,并且没有主键,这显然是不符合要求的。
所以写了以下spark存储jdbc的代码。读取mysql表方法为spark原生load(),读取完后,将会成为一张dataframe表格。此时再使用jdbc提供的方法进行存储。

注意点:获取dataframe中的每一条数据,需要用Object类型来存储。否则在插入数据时可能会出现类型转换问题。

val v = row.getValuesMap[Object](cols).values.toBuffer
statement.setObject(i+1,v.apply(i))

针对mysql现有模式为overwrite,append,upsert

整体架构

package com.mas.bgdt.dmp.framework.handler.impl

import java.sql.{DriverManager, SQLException, ResultSet}

import org.apache.spark.sql.DataFrame
import com.mas.bgdt.dmp.framework.handler.model.Connection

object JdbcHandler {

  //update
  def update(connection: Connection, sql: String) = {
    val conn = getConnection(connection)
    conn.prepareStatement(sql).executeUpdate()
    //conn.close()
  }
  //read source为jdbc:mysql://192.168.10.1:330
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值