2017-08-26 2 views
0

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

+0

Vous n'avez pas essayé Spark 2, je devine? –

+0

@ cricket_007 Comment Spark 2 fera la différence? –

+0

Amélioration significative du code SparkSQL. Juste curieux –

Répondre

0

Mais est-il un meilleur moyen d'y parvenir?

Je ne réinventerais pas la roue. Si vous rencontrez toujours le même problème avec une version Spark récente (1.6 est assez vieux) et le pilote JDBC (je suppose que c'est le seul à blâmer) juste CREATE VIEW et l'utiliser pour les requêtes.

N'oubliez pas non plus de déposer un rapport de bogue.