今天在学习SparkSQL时,按照教程上的代码,在注册数据库表时,使用registerAsTable函数注册table:
教程源码:
val sqlContext=new org.apache.spark.sql.SQLContext(sc)
import sqlContext._
case class Person(name:String,age:Int)
val people=sc.textFile("File:/home/hadoop/examples/people.txt").map(_.split(",")).map(p=>Person(p(0),p(1).trim().toInt)).toDF()
people.registerAsTable("people")
val teenagers = sqlContext.sql("select name,age from people")
teenagers.map { t => t(0)+" "+t(1) } collect() foreach { println }
但是当运行到people.registerAsTable(“people”)时,提示如下问题:
经过查找相关文章资料,终于找到问题的解决方法,故在此做个记录,以备后患。
原因分析:
(1)、函数不同:
由于源码教程使用的是Spark1.3之前的版本,而我使用的是Spark1.6版本,版本不同,所以相应的函数也就不一样了,在Spark1.3之后,注册table使用的是registerTempTable,在Spark1.6.1Documentation的DataFrame类目录下查找该函数可以得到以下解释:
从函数解释中可以知道,这个函数在Spark1.3之后替代了registerAsTable函数。
找到这个原因之后,将函数改为registerTempTable继续运行,此时源码如下:
val sqlContext=new org.apache.spark.sql.SQLContext(sc)
import sqlContext._
case class Person(name:String,age:Int)
val people=sc.textFile("File:/home/hadoop/examples/people.txt").map(_.split(",")).map(p=>Person(p(0),p(1).trim().toInt)).toDF()
people.registerTempTable("people")
val teenagers = sqlContext.sql("select name,age from people")
teenagers.map { t => t(0)+" "+t(1) } collect() foreach { println }
但是当运行到people.register