如何在spark scala中快速执行mysql查询

如何在spark scala中快速执行mysql查询,mysql,eclipse,scala,apache-spark,apache-spark-sql,Mysql,Eclipse,Scala,Apache Spark,Apache Spark Sql,我试图在eclipse中使用Scala spark从MySQL数据库获取数据。 问题是代码仅仅执行一个SQL查询就需要几个小时。 这是我的初始代码: val conf = new SparkConf().setAppName("MyApp").setMaster("local") val sc = new SparkContext(conf) val sqlcontext = new org.apache.spark.sql.SQLContext(sc) sqlcontext.setConf("

我试图在eclipse中使用Scala spark从MySQL数据库获取数据。 问题是代码仅仅执行一个SQL查询就需要几个小时。 这是我的初始代码:

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 data = sqlcontext.sql('SELECT * FROM action INNER JOIN session ON action.session_id = session.session_id")
这需要很多小时才能完成,所以我试着去拿桌子:

val df = sqlcontext.table("action").collect()
println(df.size)
但这并没有解决我的问题。最后,我只想说,我的操作表包含大约1100万行


有什么想法吗?

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

在action.session\u id和session.session\u id上添加索引,让我们知道性能是否有所提高。您试图执行的确切查询是什么?您应该在问题中包括
action
session
表的架构。了解他们的数据结构和现有索引将帮助其他人确定需要优化的领域。最快的方法是跳过Spark join。您可以直接在MySQL中执行join并获取结果:-我的表被索引了,我不认为这与join有关,因为我在尝试检索没有join的表时遇到了相同的问题。您是对的,我知道Spark在本地速度要慢得多,但我想仅仅加载一个表不需要几个小时。我将sqlcontext.table行替换为:val v=sqlcontext.jdbc(jdbcUrl,“session”,“date_created”,chanStartDate,System.currentTimeMillis(),200),其中200是分区数,现在需要几分钟才能获得本地版本的表,这对于本地版本来说很好,我认为在服务器上也会更好。非常感谢。