【问题标题】:Why Does Spark Query (Load) from Oracle Is So Slow Comparing to SQOOP?为什么 Oracle 的 Spark 查询(加载)比 SQOOP 慢?
【发布时间】:2017-02-21 19:26:33
【问题描述】:

我们发现,从 Spark 1.3 到当前的 Spark 2.0.1,使用 Spark 的 API 从 Oracle 数据库加载数据一直很慢。 Java 中的典型代码是这样的:

        Map<String, String> options = new HashMap<String, String>();
        options.put("url", ORACLE_CONNECTION_URL);
        options.put("dbtable", dbTable);
        options.put("batchsize", "100000");
        options.put("driver", "oracle.jdbc.OracleDriver");

        Dataset<Row> jdbcDF = sparkSession.read().options(options)
                .format("jdbc")
                .load().cache();
        jdbcDF.createTempView("my");

        //= sparkSession.sql(dbTable);
        jdbcDF.printSchema();
        jdbcDF.show();

        System.out.println(jdbcDF.count());

我们的一位成员曾尝试自定义这部分,当时他改进了很多(Spark 1.3.0)。但是 Spark 核心代码的某些部分变成了 Spark 的内部代码,因此在版本之后无法使用。此外,我们看到 HADOOP 的 SQOOP 在这部分比 Spark 快得多(但它写入 HDFS,这需要大量工作才能转换为数据集以供 Spark 使用)。使用 Spark 的 Dataset 写入方法写入 Oracle 似乎对我们有好处。令人费解的是为什么会发生这种情况!

【问题讨论】:

  • 得到了解决方案:options.put("batchsize", "100000") 应该替换为 options.put("fetchsize", "100000")。
  • @PauZWu :添加为应得的解决方案
  • 请@PauZWu 我想奖励赏金:)

标签: oracle apache-spark apache-spark-sql spark-dataframe


【解决方案1】:

@Pau Z Wu 已经在 cmets 中回答了这个问题,但问题是options.put("batchsize", "100000"); 这需要是options.put("fetchsize", "100000");,因为 fetch size 用于限制一次从数据库中检索的行数,并且最终会加快加载速度。

更多信息可以在这里找到:https://docs.oracle.com/cd/A87860_01/doc/java.817/a83724/resltse5.htm

【讨论】:

  • 既然 Pau Z Wu 似乎没有兴趣回答赏金是你的。
猜你喜欢
  • 2019-10-10
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2023-01-05
  • 2021-03-22
相关资源
最近更新 更多