Заимствование у 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
?
- Ссылаясь на обсуждения издержек соединения db с map против mapPartitions, могу ли я в этом случае нести
5000
x стоимость соединения, или это можно использовать повторно, как это делается здесь? Из документации по SCALA JDBC похоже, что ее можно использовать повторно.
Я думаю, что поскольку это не высокоуровневый SPARK API , как df_mysql = sqlContext.read.format("jdbc").options ...
, то я думаю, что он должен оставаться открытым, но хотел бы проверить. Может быть, SPARK env закрывает его автоматически, но я думаю, что нет. В конце обработки может быть выдано закрытие?
- Использование контекста HIVE означает, что нам не нужно каждый раз открывать соединение - или это не так? Затем, используя паркет или стол ORC, я полагаю, что такой подход позволил бы добиться высокой производительности.