借用SO 26634853
,然后提出以下问题:
像这样使用 IMPALA 连接是一次性设置:
val JDBCDriver = "com.cloudera.impala.jdbc41.Driver"
val ConnectionURL = "jdbc:impala://url.server.net:21050/default;auth=noSasl"
Class.forName(JDBCDriver).newInstance
val con = DriverManager.getConnection(ConnectionURL)
val stmt = con.createStatement()
val rs = stmt.executeQuery(query)
val resultSetList = Iterator.continually((rs.next(), rs)).takeWhile(_._1).map(r => {
getRowFromResultSet(r._2) // (ResultSet) => (spark.sql.Row)
}).toList
sc.parallelize(resultSetList)
如果我需要在loop
周围放置一个con.createStatement()
及其相关代码,并使用某些逻辑并执行一些5000
次?
5000
x连接的成本,还是可以像在这里完成的那样重复使用?从SCALA JDBC的文档看起来它可以重用。 我的想法是,因为它不是像df_mysql = sqlContext.read.format("jdbc").options ...
这样的高级SPARK API ,所以我认为它应该保持开放状态,但我想检查一下。可能是SPARK env自动关闭它,但我想不是。在处理结束时可以发出收盘?
答案 0 :(得分:0)
我试过这个模拟并且连接仍然是开放的,所以不是在foreach中提供,这不是性能方面的问题。
var counter = 0
do
{
counter = counter + 1
val dataframe_mysql = spark.read.jdbc(jdbcUrl, "(select author from family) f ", connectionProperties)
dataframe_mysql.show
} while (counter < 3)