2014-10-07 15 views
9

È possibile leggere dati da Microsoft Sql Server (e oracle, mysql, ecc.) In un rdd in un'applicazione Spark? O abbiamo bisogno di creare un set di memoria e metterlo in parallelo in un RDD?Lettura di dati da SQL Server utilizzando Spark SQL

+1

questo sta andando essere senza risposta certa: P – khandelwaldeval

+0

sembra così ... qualsiasi motivo? se può cancellare dati da tutto, perché non i negozi più comuni? – ashic

+0

dovrai aspettare qualche giorno per ottenere questa risposta, poiché il tag apache-spark' è usato molto solennemente. Aspetta un paio di giorni che i ragazzi dell'apache rispondano alla tua domanda. – khandelwaldeval

risposta

5

Trovato una soluzione a questo dalla mailing list. JdbcRDD può essere utilizzato per realizzare questo. Avevo bisogno di ottenere il jar del driver JDBC di MS Sql Server e aggiungerlo alla libreria lib per il mio progetto. Volevo usare la sicurezza integrata, e quindi avevo bisogno di mettere sqljdbc_auth.dll (disponibile nello stesso download) in una posizione che java.library.path possa vedere. Quindi, il codice simile a questo:

 val rdd = new JdbcRDD[Email](sc, 
     () => {DriverManager.getConnection(
"jdbc:sqlserver://omnimirror;databaseName=moneycorp;integratedSecurity=true;")}, 
      "SELECT * FROM TABLE_NAME Where ? < X and X < ?", 
      1, 100000, 1000, 
      (r:ResultSet) => { SomeClass(r.getString("Col1"), 
      r.getString("Col2"), r.getString("Col3")) }) 

Questo dà un DDR di SomeClass.The secondo, terzo e quarto parametro Sono necessari per limiti inferiore e superiore, e il numero di partizioni. In altre parole, i dati sorgente devono essere partizionabili in base al tempo necessario affinché funzioni.

5

In Spark 1.4.0+ è ora possibile utilizzare sqlContext.read.jdbc

che vi darà un dataframe invece di un RDD di Row oggetti.

L'equivalente alla soluzione che hai postato sopra sarebbe

sqlContext.read.jdbc("jdbc:sqlserver://omnimirror;databaseName=moneycorp;integratedSecurity=true;", "TABLE_NAME", "id", 1, 100000, 1000, new java.util.Properties)

Dovrebbe prendere lo schema della tabella, ma se vuoi per forzarlo, è possibile utilizzare il metodo dello schema dopo leggi sqlContext.read.schema(...insert schema here...).jdbc(...rest of the things...)

Nota che non otterrai un RDD di SomeClass qui (che è più bello a mio avviso). Invece otterrai un DataFrame dei campi pertinenti.

Maggiori informazioni si possono trovare qui: http://spark.apache.org/docs/latest/sql-programming-guide.html#jdbc-to-other-databases