2014-10-07 25 views
9

Microsoft Sql Server'dan (ve oracle, mysql, vb.) Spark uygulamasında bir rdd'ye veri okumak mümkün mü? Ya da bir bellek setini oluşturmamız ve bunu bir RDD'ye paralel hale getirmemiz gerekiyor mu?Verileri SQL Server kullanarak Spark SQL kullanarak okuma

+1

bu sana kesin cevapsız olacak: P – khandelwaldeval

+0

öyle görünüyor ... herhangi bir nedeni neden? Eğer her şeyden veri toplayabilirse, neden en yaygın mağazalar olmasın? – ashic

+0

, 'apache-spark' etiketi kullanıldığında bu yanıtı almak için birkaç gün beklemek zorunda kalacaksınız. Apache adamlarının sorunuzu cevaplaması için birkaç gün bekleyin. – khandelwaldeval

cevap

5

Mail Listesinden buna bir çözüm buldum. Bunu yapmak için JdbcRDD kullanılabilir. MS Sql Server JDBC sürücü jarünü almam ve projem için lib'a eklemem gerekiyordu. Entegre güvenlik kullanmak istedim ve böylece java.library.path'in görebileceği bir konumda sqljdbc_auth.dll dosyasını (aynı yüklemede mevcut) koymak gerekiyordu. Ardından, kod şöyle görünür:

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

Bu gereklidir SomeClass.The, ikinci, üçüncü ve dördüncü parametrelerin bir RDD verir ve alt ve üst sınırları içindir ve bölümleri sayısı. Başka bir deyişle, bu kaynak verisinin çalışması için uzun yıllar bölümlenebilir olması gerekir. Şimdi size yerine RDD Row nesnelerin DataFrame verecektir sqlContext.read.jdbc

kullanabilirsiniz 1.4.0+ Kıvılcım olarak

5

.

yukarıda yayınlanan çözüme eşdeğer

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

olacağını

Bu tablonun şema almak gerekir, ama bunu zorlamak isterseniz, size sonra şema yöntemini kullanabilirsiniz okumanın bir RDD of SomeClass (burada benim görüşüme daha iyi) vermeyeceğinizi unutmayın. Bunun yerine ilgili alanların bir DataFrame'i alırsınız.

fazla bilgi burada bulunabilir: http://spark.apache.org/docs/latest/sql-programming-guide.html#jdbc-to-other-databases