2014-10-07 9 views
9

Ist es möglich, Daten von Microsoft SQL Server (und Oracle, MySQL, etc.) in eine RDD in einer Spark-Anwendung zu lesen? Oder müssen wir ein In-Memory-Set erstellen und dieses in eine RDD aufteilen?Lesen von Daten aus SQL Server mit Spark SQL

+1

Das wird offen sein für sicher: P – khandelwaldeval

+0

scheint so ... keinen Grund, warum? Wenn es Daten von allem munge, warum nicht die häufigsten Geschäfte? – ashic

+0

Sie müssen auf ein paar Tage warten, um diese Antwort zu bekommen, da das Tag 'Apache-Funke' sehr feierlich verwendet wird. Warten Sie ein paar Tage, bis die Jungs von Apache Ihre Frage beantworten. – khandelwaldeval

Antwort

5

Eine Lösung aus der Mailingliste gefunden. JdbcRDD kann dazu verwendet werden. Ich musste den MS Sql Server JDBC-Treiber-JAR erhalten und ihn zur lib für mein Projekt hinzufügen. Ich wollte integrierte Sicherheit verwenden und musste daher sqljdbc_auth.dll (verfügbar im selben Download) an einem Speicherort, den java.library.path sehen kann, platzieren. Dann sieht der Code wie folgt aus:

 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")) }) 

Dies ergibt eine Rdd von SomeClass.The zweiten, dritten und vierten Parameter erforderlich sind und sind für untere und obere Grenze und die Anzahl der Partitionen. Mit anderen Worten, diese Quelldaten müssen lange partitionierbar sein, damit dies funktioniert.

5

In Funken 1.4.0+ Sie jetzt sqlContext.read.jdbc

verwenden können, dass Sie einen Datenrahmen anstelle einer RDD von Row-Objekte geben.

Das entspricht der Lösung, die Sie oben geschrieben wäre

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

Es sollte das Schema der Tabelle holen, aber wenn man es erzwingen möchten, können Sie das Schema-Methode nach Lesen Sie sqlContext.read.schema(...insert schema here...).jdbc(...rest of the things...)

Beachten Sie, dass Sie hier nicht eine RDD von SomeClass bekommen (was meiner Ansicht nach schöner ist). Stattdessen erhalten Sie einen Datenrahmen der relevanten Felder.

Weitere Informationen finden Sie hier: http://spark.apache.org/docs/latest/sql-programming-guide.html#jdbc-to-other-databases