2017-08-26 5 views
0

Ich habe versucht, JDBC ResultSet zu Spark RDD zu konvertieren und suchte nach einer effizienten Möglichkeit, dies mit der Parallelitätsfunktion von Spark zu tun.Konvertieren von JDBC ResultSet zu Spark RDD/DataFrame

Im Folgenden finden Sie, was ich als umgesetzt haben je diese 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) 

Nun ist die wichtigste Frage ist es mehr Zeit nehmen, und ich verstehe alle Datensatzes durch eine Nadel eye.But gezogen wird, ist es eine bessere Art und Weise zu Dies erreichen?

Einige wundern sich, warum ich nicht eingebauten Feature sqlContext.read.format verwenden, um dies zu erreichen, ist der Grund, Spark umschließt eine "SELECT * FROM()" um die Abfrage, die Problem mit komplexen Abfragen erstellt. Bitte beachten Sie den Link für Details Issue with WITH clause with Cloudera JDBC Driver for Impala - Returning column name instead of actual Data

+0

Sie haben Spark 2 nicht versucht, schätze ich? –

+0

@ cricket_007 Wie Spark 2 wird einen Unterschied machen? –

+0

Signifikante Verbesserung des SparkSQL-Codes. Nur neugierig –

Antwort

0

Aber gibt es einen besseren Weg, dies zu erreichen?

Ich würde das Rad nicht neu erfinden. Wenn Sie immer noch das gleiche Problem mit einer aktuellen Spark-Version (1.6 ist ziemlich alt) und JDBC-Treiber (ich denke, es ist die eine Schuld) nur CREATE VIEW und verwenden Sie es für Abfragen.

Vergessen Sie auch nicht, einen Fehlerbericht zu archivieren.