为什么来自Oracle的Spark查询(加载)与SQOOP相比如此之慢?

时间:2016-10-12 20:41:43

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

我们发现从Spark数据库加载数据与来自Oracle数据库的API一直很慢,因为Spark 1.3到现在的Spark 2.0.1。典型的代码在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似乎对我们有好处。令人费解的是为什么会发生这种情况!

1 个答案:

答案 0 :(得分:3)

那么@Pau Z Wu已在评论中回答了问题,但问题是options.put("batchsize", "100000");这需要options.put("fetchsize", "100000");,因为获取大小涉及限制从数据库中一次性恢复的行数最终会加快加载时间。

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