[英]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.