ash*_*hic 9 sql apache-spark apache-spark-sql
是否可以将Microsoft Sql Server(以及oracle,mysql等)中的数据读入Spark应用程序中的rdd?或者我们是否需要创建一个内存集并将其并行化为RDD?
从邮件列表中找到了解决方案.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来分区才能使其工作.
在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
| 归档时间: |
|
| 查看次数: |
12824 次 |
| 最近记录: |