无法使用 jdbc 将 spark 数据集写入数据库

Posted

技术标签:

【中文标题】无法使用 jdbc 将 spark 数据集写入数据库【英文标题】:Not able to write spark dataset to database using jdbc 【发布时间】:2019-05-15 14:08:33 【问题描述】:

我需要将我的 spark 数据集写入 oracle 数据库表。我正在使用带有附加模式的数据集写入方法。但是得到分析异常, 当使用 spark2-submit 命令在集群上触发 spark 作业时。

我已阅读 json 文件,将其展平并设置为 abcDataset 的数据集。

Spark 版本 - 2 甲骨文数据库 JDBC 驱动程序 - oracle.jdbc.driver.OracleDriver 编程语言 - Java

Dataset<Row> abcDataset= dataframe.select(col('abc').....and other columns;


Properties dbProperties = new Properties();
            InputStream is = SparkReader.class.getClassLoader().getResourceAsStream("dbProperties.yaml");
            dbProperties.load(is);
            String jdbcUrl = dbProperties.getProperty("jdbcUrl");
            dbProperties.put("driver","oracle.jdbc.driver.OracleDriver");
            String where = "USER123.PERSON";
            abcDataset.write().format("org.apache.spark.sql.execution.datasources.jdbc.DefaultSource").option("driver", "oracle.jdbc.driver.OracleDriver").mode("append").jdbc(jdbcUrl, where, dbProperties);

预期 - 写入数据库但收到以下错误 -

org.apache.spark.sql.AnalysisException: Multiple sources found for jdbc (org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider, org.apache.spark.sql.execution.datasources.jdbc.DefaultSource), please specify the fully qualified class name.;
    at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:670) 

当我在集群上运行此命令时,我们是否需要在 spark submit 命令中设置任何其他属性,或者缺少任何步骤?

【问题讨论】:

读取的 json 在调用其 show 函数时正确打印到数据集中。此外,json 被正确展平,没有任何错误。只有当我们选择几列并尝试保存到数据库中时,它才行不通。 【参考方案1】:

当您通过 jdbc 从 spark 写入 rdbms 时,您需要使用 abcDataset.write.jdbc 或 abcDataset.write.format("jdbc")。

【讨论】:

如果您检查以下文件:- /org/apache/spark/sql/execution/datasources/DataSource.scala private val backwardCompatibilityMap: Map[String, String] = val jdbc = classOf[JdbcRelationProvider ].getCanonicalName 映射(“org.apache.spark.sql.jdbc”-> jdbc,“org.apache.spark.sql.jdbc.DefaultSource”-> jdbc,“org.apache.spark.sql.execution.datasources。 jdbc.DefaultSource" -> jdbc, "org.apache.spark.sql.execution.datasources.jdbc" -> jdbc, "spark.sql.json" -> json,我们要维护jdbc jar,还有很多,那么如何让它独一无二

以上是关于无法使用 jdbc 将 spark 数据集写入数据库的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL - 无法将所有记录写入配置单元表

将数据集写入 MS SQL 服务器失败

如何将 Spark 数据帧写入 impala 数据库

将 Spark 数据集转换为 JSON 并写入 Kafka Producer

使用 Apache Spark 1.4.0 写入 Oracle 数据库

Spark将DataFrame写入jdbc错误