J'essayais de convertir JDBC ResultSet en Spark RDD et je cherchais un moyen efficace de le faire en utilisant la fonctionnalité de parallélisme de Spark.Conversion JDBC ResultSet en Spark RDD/DataFrame
Voici ce que j'ai mis en œuvre selon ce https://stackoverflow.com/a/32073423/6064131
val rs:ResultSet = stmt .getResultSet
val colCount = rs.getMetaData.getColumnCount
def getRowFromResultSet(resultSet: ResultSet): String ={
var i:Int = 1
var rowStr=""
while(i<=colCount){
rowStr=rowStr+resultSet.getString(i)+delim
i+=1
}
rowStr
}
val resultSetList = Iterator.continually((rs.next(), rs)).takeWhile(_._1).map(r => {
getRowFromResultSet(r._2) // (ResultSet) => (spark.sql.Row)
}).toList
val x = sc.parallelize(resultSetList)
Maintenant, la question principale est qu'il prend plus de temps et je comprends tout ensemble de données est tirée à travers une aiguille de eye.But est-il une meilleure façon de atteindre cet? Certains pourraient se demander pourquoi je n'utilise pas la fonction intégrée sqlContext.read.format pour y parvenir, la raison en est que Spark enveloppe un "SELECT * FROM()" autour de la requête qui crée un problème avec des requêtes complexes. S'il vous plaît consulter le lien pour plus de détails Issue with WITH clause with Cloudera JDBC Driver for Impala - Returning column name instead of actual Data
Vous n'avez pas essayé Spark 2, je devine? –
@ cricket_007 Comment Spark 2 fera la différence? –
Amélioration significative du code SparkSQL. Juste curieux –