2017-09-12 39 views
-3

嗨,我是一名使用java的apache spark的新学员 这是一种正确的方法吗? 这段代码正在工作,但性能非常缓慢,我不知道哪一个是访问每个循环数据的最佳方法。使用Apache-Spark-SQL访问数据库

Dataset<Row> javaRDD = sparkSession.read().jdbc(dataBase_url, "sample", properties); 

javaRDD.toDF().registerTempTable("sample"); 

Dataset<Row> Users = sparkSession.sql("SELECT DISTINCT FROM_USER FROM sample "); 

List<Row> members = Users.collectAsList(); 

for (Row row : members) { 

Dataset<Row> userConversation = sparkSession.sql("SELECT DESCRIPTION FROM sample WHERE FROM_USER ='"+ row.getDecimal(0) +"'"); 
userConversation.show(); 

} 
+0

您正在为循环的每次迭代执行查询。这总是会很慢。 – Kayaman

+0

thnx,使用spark代码访问它的任何其他方法? – saara

+0

当然。如果做事情的唯一方式是缓慢和不好的方式,那就没有什么用处了。 – Kayaman

回答

0

尝试创建一组与所有用户,然后让您只需支付需要DB连接只有一次的开销执行查询像

sparkSession.sql("SELECT DESCRIPTION FROM sample WHERE FROM_USER IN usersSet); 

只是执行一个查询这样。

如果您在HDFS上运行Spark并且这是一次性查询,另一种方法是使用类似Sqoop的工具在Hadoop中加载SQL表并在Spark中原生使用数据。