2014-10-07 88 views
9

是否可以从Microsoft Sql Server(以及oracle,mysql等)将数据读入Spark应用程序中的rdd?或者我们是否需要创建一个内存集并将其并行化为一个RDD?使用Spark SQL从SQL Server读取数据

+1

这会是没有答案是肯定的:P – khandelwaldeval 2014-10-07 15:11:20

+0

显得那么...有什么理由?如果它能够从一切中获取数据,为什么不是最常见的商店? – ashic 2014-10-08 12:25:30

+0

你将不得不等待几天才能得到这个答案,因为标签'apache-spark'非常庄严地使用。等待几天apache的人回答你的问题。 – khandelwaldeval 2014-10-08 12:36:44

回答

5

从邮件列表中找到了解决方法。 JdbcRDD可以用来实现这一点。我需要获取MS Sql Server JDBC驱动程序jar并将其添加到我的项目的lib中。我想使用集成安全性,因此需要将sqljdbc_auth.dll(可在相同的下载中找到)放在java.library.path可以看到的位置。然后,代码看起来是这样的:

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

这给出SomeClass.The第二,第三和第四参数的放射性散布是必需的,对于下限和上限,和分区数。换句话说,该源数据需要长期分割才能发挥作用。

5

火花1.4.0+您现在可以使用sqlContext.read.jdbc

这会给你一个数据帧而不是行的RDD的对象。

相当于你上面贴的解决办法是

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

应该拿起桌上的模式,但是如果你想强迫它,你可以使用后的架构方法阅读sqlContext.read.schema(...insert schema here...).jdbc(...rest of the things...)

请注意,您不会在这里获得SomeClass的RDD(这在我看来更好)。相反,您会得到相关字段的DataFrame。

更多信息可以在这里找到:http://spark.apache.org/docs/latest/sql-programming-guide.html#jdbc-to-other-databases