我正在尝试在Scala中使用case class
将架构定义为CSV文件。
case class userSchema(name : String,
place : String,
designation : String)
object userProcess {
val spark = SparkSession.builder().appName("Spark_processing for Hbase").master("yarn").getOrCreate()
import spark.implicits._
val colNames = classOf[userSchema].getDeclaredFields.map(f=> f.getName)
val file = spark.read.option("inferSchema", false).option("header", false).csv("D:\\wSapce\\User.csv").toDF(colNames:_*).as(userSchema)
}
但是在最后一行(对于有价文件),我得到了低于编译时错误的信息:
overloaded method value as with alternatives: (alias: Symbol)org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] <and> (alias: String)org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] <and> [U](implicit evidence$2: org.apache.spark.sql.Encoder[U])org.apache.spark.sql.Dataset[U] cannot be applied to (tavant.user.userSchema.type)
任何想法我为什么会收到此错误...?
答案 0 :(得分:2)
问题出在下面一行:
val file = spark.read.option("inferSchema", false).option("header", false).csv("D:\\wSapce\\User.csv").toDF(colNames:_*).as(userSchema)
spark.read.option()。csv-将返回DataFrame。您无需再次toDF()即可转换为DataFrame。
您可以使用as(userSchema)方法将具有定义的scehma(案例类)的DataFrame转换为数据集,如下所示:
val file = spark.read.option("inferSchema", false).option("header", false).csv("D:\\wSapce\\User.csv").as(userSchema)