使用Spark SQL从SQL Server读取数据

ash*_*hic 9 sql apache-spark apache-spark-sql

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

ash*_*hic 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")) } )
Run Code Online (Sandbox Code Playgroud)

这给出了SomeClass的Rdd.第二,第三和第四个参数是必需的,用于下限和上限,以及分区数.换句话说,源数据需要由long来分区才能使其工作.


kan*_*elc 5

在Spark 1.4.0+中,您现在可以使用 sqlContext.read.jdbc

这将为您提供DataFrame而不是Row对象的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