为什么来自Oracle的Spark查询(加载)比来自SQOOP的慢?

ff29svar  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(194)

我们发现,从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的数据集写入方法向Oracle写入数据似乎对我们有好处。这是令人费解的,为什么会发生这种事!

ki0zmccv

ki0zmccv1#

@Pau Z Wu已经在评论中回答了这个问题,但问题是1d0d1e这需要是options.put("fetchsize", "100000");,因为Fetch Size涉及限制一次从数据库检索的行数,最终会使加载时间更快。

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

相关问题