【问题标题】:Spark-sqlserver connectionSpark-sqlserver 连接
【发布时间】:2018-01-17 07:12:20
【问题描述】:

我们可以将 spark 与 sql-server 连接起来吗?如果是这样,怎么做? 我是 spark 新手,我想将服务器连接到 spark 并直接从 sql-server 工作,而不是上传 .txt 或 .csv 文件。请帮忙,谢谢。

【问题讨论】:

    标签: sql-server apache-spark data-analysis


    【解决方案1】:
    // Spark 2.x
    import org.apache.spark.SparkContext
    
    // Create dataframe on top of SQLServer database table
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    
    val jdbcDF = sqlContext.read.format("jdbc").option("driver" , "com.microsoft.sqlserver.jdbc.SQLServerDriver") \
               .option("url", "jdbc:sqlserver://XXXXX.com:port;databaseName=xxx") \
               .option("dbtable", "(SELECT * FROM xxxx) tmp") \
               .option("user", "xxx") \
               .option("password", "xxx") \
               .load()
    
    // show sample records from data frame
    
    jdbcDF.show(5)
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    • 如果您可以在代码中看到,它很简单,首先我使用 Spark 上下文创建所需的 Spark SQL 上下文,一旦您准备好 SparkSQL 上下文,那么我使用相同的 SparkSQL 上下文(sqlcontext)连接到 Microsoft SQLServer 数据库,我在其中提供了驱动程序详细信息,例如 JDBC url、数据库表和用户凭据等,这将在其上创建 Spark 数据框。
    • class SQLContext 已弃用:改用 SparkSession.builder
    • 您好,运行此代码时出现以下错误:驱动程序无法使用安全套接字层 (SSL) 加密建立与 SQL Server 的安全连接。你能帮帮我吗?
    【解决方案2】:

    这里有一些代码 sn-ps。 DataFrame 用于创建表 t2 并插入数据。 SqlContext 用于将 t2 表中的数据加载到 DataFrame 中。我将 spark.driver.extraClassPath 和 spark.executor.extraClassPath 添加到我的 spark-default.conf 文件中。

    //Spark 1.4.1
    
    //Insert data from DataFrame
    
    case class Conf(mykey: String, myvalue: String)
    
    val data = sc.parallelize( Seq(Conf("1", "Delaware"), Conf("2", "Virginia"), Conf("3", "Maryland"), Conf("4", "South Carolina") ))
    
    val df = data.toDF()
    
    val url = "jdbc:sqlserver://wcarroll3:1433;database=mydb;user=ReportUser;password=ReportUser"
    
    val table = "t2"
    
    df.insertIntoJDBC(url, table, true)
    
    //Load from database using SqlContext
    
    val url = "jdbc:sqlserver://wcarroll3:1433;database=mydb;user=ReportUser;password=ReportUser"
    
    val driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    
    val tbl = { sqlContext.load("jdbc", Map( "url" -> url, "driver" -> driver, "dbtable" -> "t2", "partitionColumn" -> "mykey", "lowerBound" -> "0", "upperBound" -> "100", "numPartitions" -> "1" ))}
    
    tbl.show()
    

    需要考虑的一些问题是:

    确保防火墙端口对端口 1433 开放。 如果使用 Microsoft Azure SQL Server DB,表需要主键。一些方法创建表,但是Spark的代码没有创建主键,所以创建表失败。

    其他需要注意的细节:https://docs.databricks.com/spark/latest/data-sources/sql-databases.html

    来源:https://blogs.msdn.microsoft.com/bigdatasupport/2015/10/22/how-to-allow-spark-to-access-microsoft-sql-server/

    【讨论】:

    • 我得到了一个例外---->>scala> Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver") java.lang.ClassNotFoundException: com.microsoft. sqlserver.jdbc.SQLServerDriver
    • 我希望你已经下载了sql jdbc驱动并把它放在类路径中。否则从microsoft.com/en-in/download/details.aspx?id=11774下载它
    【解决方案3】:

    在 SQL Server 大数据集群中,Spark 也包括在内。从 SQL Server 2019 版本开始,大数据集群允许通过 HDFS 文件系统和其他数据源对数据进行大规模、近乎实时的处理。它还利用集成到一个环境中的 Apache Spark 框架来管理、监控和保护您的环境。

    Weissman, B.& Van de Laar E. (2019)。 SQL Server 大数据集群:基于候选版本 1 的早期第一版。荷兰:Apress。

    【讨论】:

      猜你喜欢
      • 2016-02-05
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多