繁体   English   中英

地图中的spark scala中的单身人士

[英]singleton in spark scala in map

我有一个用例,我需要从 spark 写入 postgres 数据库,

我已将传入文件读取到 rdd,我的最终结果是一个可以写入 postgres 的 rdd。在 rdd 映射函数中,我试图创建 jdbc 模板并写入 postgres。我希望我的 jdbc 模板为单例,并且已将 jdbctemplate 作为对象。但它似乎仍然无法正常工作并打开了太多连接。

rddToPostgres.map(postgresdata => toPostgresDatabase(r))




toPostgresDatabase(postgresdata:Row) {

var dataToLoad = new MapSqlParameterSource().addValue("Nifi_Param",postgresdata.getAs("Nifi_Param")

var insertStatement = "insert in to postgresschema.nifitab(nifi_param) values(:nifi_param)"

new JdbcTemplate().getJdbcConn().update(insertStatement,dataToLoad)

}

}

Object JdbcTemplate(){


def getJdbcConn() {

new NamedParameterJdbcTemplate(new DriverManagerDataSource().setDriverClassName().setPassword("XXXXX").setUsername("XXXXX"));
}

虽然 JdbcTemplate 是单例,因为它被定义为多次调用的对象,有人可以建议如何在 scala 中创建单例并在 rdd.map 中使用它吗?

因为getJdbcConn是一个函数 ( def ),所以每次调用时都会对其进行评估。 如果您将其设为val则它只会被评估一次。

此外,无需通过new实例化对象。

object JdbcTemplate {
  val jdbcConnection = new NamedParameterJdbcTemplate(new DriverManagerDataSource().setDriverClassName().setPassword("....").setUsername("....")
}

rddToPostgres.map { postgresData: Row =>
  val dataToLoad = new MapSqlParameterSource().addValue("Nifi_Param", postgresData.getAs("Nifi_Param"))
  val insertStatement = "insert in to postgresschema.nifitab(nifi_param) values(:nifi_param)"

  JdbcTemplate.jdbcConnection.update(insertStatement, dataToLoad)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM