Spark DataFrame - 上一个分区收集慢

时间:2015-05-13 18:15:17

标签: java jdbc dataframe apache-spark-sql

我有一个Java代码段,可以从远程Oracle数据库中读取记录(至少65k记录)。基本上,我们试图将每小时过滤器传递给数据帧,以便在每小时分区x 24上获取记录。

源视图基于包含数百万条记录的表。

我们面临的问题是,Spark(在YARN上或作为SPARK集群)在3分钟内处理24个分区中的22个。最后2个分区需要5个多小时才能完成。

我们有什么办法可以使用DataFrame来提高速度吗?

HashMap<String, String> options = new HashMap<>();
sqlContext.setConf("spark.sql.shuffle.partition", "50");
options.put("dbtable", "( select * from "+VIEW_NAME+" where 1=1)");
options.put("driver", "oracle.jdbc.OracleDriver");
options.put("url", JDBC_URL);
options.put("partitionColumn", "hrs");
options.put("lowerBound", "00");
options.put("upperBound", "23");
options.put("numPartitions", "24");

DataFrame dk = sqlContext.load("jdbc", options).cache();   
dk.registerTempTable(VIEW_NAME);
dk.printSchema();
DateTime dt = new DateTime(2015, 5, 8, 10, 0, 0);
String s = SQL_DATE_FORMATTER.print(dt);
dt = dt.plusHours(24);
String t = SQL_DATE_FORMATTER.print(dt);
System.out.println("S is " + s + "and t is "+ t);
Stream<Row> rows = dk.filter("DATETIME >= '" + s + "' and DATETIME <= '" + t + "'").collectAsList().parallelStream();
    System.out.println("Collected" + rows.count());

1 个答案:

答案 0 :(得分:0)

不确定如果这是一个完整的答案,但作为解决方法,如果我们执行以下操作

dt = dt.plusHours(24).minusSeconds(1)

速度更快,但仍然不如前23个分区快