Spark SQL for JDBC 从其他数据库获取数据

Posted

技术标签:

【中文标题】Spark SQL for JDBC 从其他数据库获取数据【英文标题】:Spark SQL for JDBC to fetch data from other database 【发布时间】:2015-03-24 13:59:24 【问题描述】:

随着新 spark 1.3 的发布,我很高兴尝试 JDBC 函数(在 Python 中)。但是,由于遇到的错误,我认为此时帮助不是可选的:

这是我所做的:

    我从 scala 下的典型 spark shell 开始

    SPARK_CLASSPATH=/jdbc_path/some-jdbc-driver.jar bin/spark-shell
    

    结果在 INFO 中:使用--driver-class-path(我也跟着)

    在PySpark REPEL中,导入了相关包,我使用了

    df2 = sqlCtx.load("jdbc", url="jdbc:ncluster://serveraddress:2406/database?user=myid&password=mypass", driver="com.asterdata.ncluster.Driver", dbtable="mytable")
    

但错误消息一直显示 spark_home/jdbc 没有此类文件。

请问:

    在设置额外的外部类时,我如何知道它是否被很好地包含在内? 只是一个简单的 JDBC 链接到其他数据库,有没有 JDBC 的完整示例?

【问题讨论】:

【参考方案1】:

    您可以通过http://localhost:4040/environment/ 访问 Spark 环境 UI 以检查是否包含 jar。

    我也遇到过同样的问题(2),试试:

    df2 = sqlCtx.load(source="jdbc", url="jdbc:ncluster://serveraddress:2406/database?user=myid&password=mypass", driver="com.asterdata.ncluster.Driver", dbtable="mytable")
    

让我知道它是否有效。就我而言,它有效,但我仍然无法与我的数据库建立连接,因为 spark 无法识别我的 jar 文件。这听起来很奇怪,但它正在以某种方式发生。

如果你能连接,请告诉我。

【讨论】:

嗨!我正在做类似的事情。 sqlCtx.load() 和 sqlContext.load() 有什么区别?一个只是别名吗? 没有区别,sqlCtx & sqlContext 都是一样的。只是变量名不同。【参考方案2】:

不要设置 SPARK_CLASSPATH(至少在 Spark 1.5.2 上表示已弃用),请尝试关注 this answer 并编辑 conf/spark-defaults.conf 在下面添加两行。

spark.driver.extraClassPath /path/to/my.jar
spark.executor.extraClassPath /path/to/my.jar

我不需要使用--driver-class-path,因为默认情况下会在 Spark 启动时加载 jar。

【讨论】:

以上是关于Spark SQL for JDBC 从其他数据库获取数据的主要内容,如果未能解决你的问题,请参考以下文章

第八篇|Spark SQL百万级数据批量读写入MySQL

Spark上的Hive如何从jdbc读取数据?

如何在 Bluemix 中将 SQL 数据库加载到 Analytics for Apache Spark?

SPARK SQL - 使用 DataFrames 和 JDBC 更新 MySql 表

使用 Dataframes 从 Informix 到 Spark 的 JDBC

将 spark 应用程序连接到远程 sql 服务器时出现 jdbc 连接超时错误