前言
今天在调试一个Scala程序时,IDEA报了can not resolve symbol toDF
的错误, 查看了一下代码, 该行的逻辑是将RDD转成DataFrame,看起来似乎很正常, 但就是没有办法调用toDF
方法,查看了一下上下文,原来是在代码重构的时候,不小心的将import sqlContext.implicits._
给移除了。
解决方法
如果使用的是spark 2.0之前的版本,RDD转换之前, 加入以下代码:
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
如果你使用的时spark 2.0+,则可以使用以下方法:
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder.master("local[4]").getOrCreate
import spark.implicits._
顺便总结下Spark中将RDD转换成DataFrame的两种方法, 代码如下:
- 方法一: 使用
createDataFrame
方法//StructType and convert RDD to DataFrame val schema = StructType( Seq( StructField("name",StringType,true) ,StructField("age",IntegerType,true) ) ) val rowRDD = sparkSession.sparkContext .textFile("/tmp/people.txt",2) .map( x => x.split(",")).map( x => Row(x(0),x(1).trim().toInt)) sparkSession.createDataFrame(rowRDD,schema) } }
- 方法二: 使用
toDF
方法//use case class Person case class Person(name:String,age:Int) //导入隐饰操作,否则RDD无法调用toDF方法 import sparkSession.implicits._ val peopleRDD = sparkSession.sparkContext .textFile("/tmp/people.txt",2) .map( x => x.split(",")).map( x => Person(x(0),x(1).trim().toInt)).toDF()
注意
请不要将case Class
定义在main 方法中与toDF一起使用