2017-09-12 102 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中原生使用數據。