2016-11-22 88 views
-1

我想在eclipse中使用Scala spark来从MySQL数据库中获取数据。 问题是代码需要数小时才能执行一个SQL查询。 这是我最初的代码:如何在Spark Spark中快速执行mysql查询

val conf = new SparkConf().setAppName("MyApp").setMaster("local") 
val sc = new SparkContext(conf) 
val sqlcontext = new org.apache.spark.sql.SQLContext(sc) 
sqlcontext.setConf("url", "mysql://localhost:3306/myDB?user=us&password=pw") 

val action = sqlcontext.jdbc(jdbcUrl, "action").registerTempTable("action") 
val session = sqlcontext.jdbc(jdbcUrl, "session").registerTempTable("session") 
sqlcontext.cacheTable("action") 
sqlcontext.cacheTable("session") 

然后,为了从数据库获取数据我试了很多命令

​​

这需要很多时间来完成,所以我试图中庸之道拿到表:

val df = sqlcontext.table("action").collect() 
println(df.size) 

但是这并没有解决我的问题。最后只想说我的行为表包含大约1100万行。

任何想法?

+0

在action.session_id和session.session_id上添加索引并让我们知道性能是否提高。 – radumanolescu

+0

什么是你想要执行的确切查询? –

+1

你应该在你的问题中包含'action'和'session'表的模式。了解他们的数据结构和现有索引将有助于他人确定优化领域。 –

回答

1

长时间运行的工作是多种原因。正如你所提到的,你的主人是“本地人”,你正在一个执行者线程上运行。当Spark分区良好时,它会做得更好。请检查您的案例中创建了多少个分区。如果是一个,请使用重新分区(numberofpartitions:int)重新分区,并使用更多线程运行以实现并行处理(local [8]/local [*])。

+0

你说得对,我知道Spark在本地速度要慢很多,但我想这不会花几个小时才能装载一张表。我将sqlcontext.table行替换为: val v = sqlcontext.jdbc(jdbcUrl,“session”,“date_created”,chanStartDate,System.currentTimeMillis(),200) 其中200是分区的数量,现在它需要几分钟的时间才能获得本地的表格,这对于本地版本来说很有用,我认为它在服务器上也会更好。 谢谢。 – tammuz