spark update mysql_SPARK SQL - 使用DataFrames和JDBC更新MySql表

遗憾的是,在Spark中没有SaveMode.Upsert模式,因为这种情况很普遍,比如插入。

zero322在一般情况下是正确的,但我认为应该有可能(在性能上有所妥协)提供这种替换功能。

我也想为这种情况提供一些java代码。 当然,它并不像内置的火花一样具有高性能 - 但它应该是您的要求的良好基础。只需将其修改为您的需求:

myDF.repartition(20); //one connection per partition, see below

myDF.foreachPartition((Iterator t) -> {

Connection conn = DriverManager.getConnection(

Constants.DB_JDBC_CONN,

Constants.DB_JDBC_USER,

Constants.DB_JDBC_PASS);

conn.setAutoCommit(true);

Statement statement = conn.createStatement();

final int batchSize = 100000;

int i = 0;

while (t.hasNext()) {

Row row = t.next();

try {

// better than REPLACE INTO, less cycles

statement.addBatch(("INSERT INTO mytable " + "VALUES ("

+ "'" + row.getAs("_id") + "',

+ "'" + row.getStruct(1).get(0) + "'

+ "') ON DUPLICATE KEY UPDATE _id='" + row.getAs("_id") + "';"));

//conn.commit();

if (++i % batchSize == 0) {

statement.executeBatch();

}

} catch (SQLIntegrityConstraintViolationException e) {

//should not occur, nevertheless

//conn.commit();

} catch (SQLException e) {

e.printStackTrace();

} finally {

//conn.commit();

statement.executeBatch();

}

}

int[] ret = statement.executeBatch();

System.out.println("Ret val: " + Arrays.toString(ret));

System.out.println("Update count: " + statement.getUpdateCount());

conn.commit();

statement.close();

conn.close();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值