在数据集上获取AnalysisException

时间:2018-04-02 14:23:53

标签: scala apache-spark dataset

我正在尝试使用数据集在scala中读取CSV文件。之后我正在进行一些操作。但是我的代码抛出了错误。 以下是我的代码:

 final case class AadharData(date:String,
                                    registrar:String,
                                    agency:String,
                                    state:String,
                                    district:String,
                                    subDistrict:String,
                                    pinCode:Int,
                                    gender:String,
                                    age:Int,
                                    aadharGenerated:Int,
                                    rejected:Int,
                                    mobileNo:Double,
                                    email:String)

     val spark = SparkSession.builder().appName("GDP").master("local").getOrCreate()
     import spark.implicits._
     val a = spark.read.option("header", false).csv("D:\\BGH\\Spark\\aadhaar_data.csv").as[AadharData]
     val b = a.map(rec=>{
          (rec.registrar,1)
        }).groupByKey(f=>f._1).collect()

我收到了以下错误:

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '`date`' given input columns: [_c0, _c2, _c1, _c3, _c5, _c8, _c9, _c7, _c6, _c11, _c12, _c10, _c4];

感谢任何帮助: 提前谢谢。

1 个答案:

答案 0 :(得分:1)

  
    

线程中的异常" main" org.apache.spark.sql.AnalysisException:无法解析' date'给定输入列:[_ c0,_c2,_c1,_c3,_c5,_c8,_c9,_c7,_c6,_c11,_c12,_c10,_ c4];

  

上面的错误是因为您使用了header选项作为false .option("header", false))所以 spark会将列名称生成为_c0,_c1等等。虽然使用案例类对生成的数据帧进行类型转换,但您使用的列名称与已生成的列名称不同因此发生上述错误

解决方案

你应该告诉spark sql生成案例类中使用的名称,并且告诉它输入inferchema

val columnNames = classOf[AadharData].getDeclaredFields.map(x => x.getName)
val a = sqlContext.read.option("header", false).option("inferSchema", true)
  .csv("D:\\BGH\\Spark\\aadhaar_data.csv").toDF(columnNames:_*).as[AadharData]

上述错误应该消失