我正在使用java API测试这个框架,特别是SQL模块。在java中作为独立运行它,我有更好的结果(甚至在同一台机器上运行),然后是纯sql(在pgadmin上运行)。
在同一个bd(postgres 9.4和9.5)中执行完全相同的查询,spark几乎快5倍,下面是我的代码:
private static final JavaSparkContext sc =
new JavaSparkContext(new SparkConf()
.setAppName("SparkJdbc").setMaster("local[*]"));
public static void main(String[] args) {
StringBuilder sql = new StringBuilder();
sql.append(" my query ");
long time = System.currentTimeMillis();
DbConnection dbConnection = new DbConnection("org.postgresql.Driver", "jdbc:postgresql://localhost:5432/mydb", "user", "pass");
JdbcRDD<Object[]> jdbcRDD = new JdbcRDD<>(sc.sc(), dbConnection, sql.toString(),
1, 1000000000, 20, new MapResult(), ClassManifestFactory$.MODULE$.fromClass(Object[].class));
JavaRDD<Object[]> javaRDD = JavaRDD.fromRDD(jdbcRDD, ClassManifestFactory$.MODULE$.fromClass(Object[].class));
// javaRDD.map((final Object[] record) -> {
// StringBuilder line = new StringBuilder();
// for (Object o : record) {
// line.append(o != null ? o.toString() : "").append(",");
// }
// return line.toString();
// }).collect().forEach(rec -> System.out.println(rec));
System.out.println("Total: " + javaRDD.count());
System.out.println("Total time: " + (System.currentTimeMillis() - time));
}
即使我取消注释代码以将结果打印到控制台,它仍然运行得更快。
我想知道如何更快,如果源(bd)是相同的,任何人都可以解释它吗?也许使用并行查询?
编辑:有关于postgres进程的相关信息,在待机状态下,postgres使用12进程并通过pgadmin运行查询,数字不会改变,超过spark,最多20个,这意味着火花可能会使用一些并行机制来完成这项工作。