【问题标题】:Reading data from SQL Server using Spark SQL使用 Spark SQL 从 SQL Server 读取数据
【发布时间】:2014-12-02 01:21:53
【问题描述】:

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

【问题讨论】:

  • 这肯定没有答案:P
  • 似乎如此......为什么?如果它可以从所有东西中收集数据,为什么不是最常见的商店?
  • 您将不得不等待几天才能得到答案,因为标签apache-spark 被非常郑重地使用。等待几天让 apache 人员回答您的问题。
  • 您当然可以将数据读入驱动程序,然后将其并行化到 RDD 中。如果您正在寻找更具可扩展性的解决方案,您可能希望考虑将DBInputFormat 与 Spark 的“Hadoop API”方法一起使用。我以前没有这样做过,但看起来很值得研究。

标签: sql apache-spark apache-spark-sql


【解决方案1】:

在 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)

它应该会获取表的schema,但如果你想强制它,你可以在阅读sqlContext.read.schema(...insert schema here...).jdbc(...rest of the things...)后使用schema方法

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

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

【讨论】:

    【解决方案2】:

    从邮件列表中找到了解决方案。 JdbcRDD 可用于完成此操作。我需要获取 MS Sql Server JDBC 驱动程序 jar 并将其添加到我的项目的库中。我想使用集成安全性,因此需要将 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 的 Rdd。第二、第三和第四个参数是必需的,用于下限和上限,以及分区数。换句话说,该源数据需要按 long 进行分区才能正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多