AnalysisException:无法解析(_1,_2,_3)中的列名“XYZ”

时间:2017-04-22 12:02:45

标签: scala apache-spark spark-dataframe

在下面的方法中,我尝试对输入Iterable进行一些聚合操作,并输出不同的Iterable对。为此,我创建了一个RDD,定义了模式,然后从RDD创建了DataFrame。

//Create a Row RDD
    val recordRDD = sc.makeRDD(tuples.toSeq).map(locTempRow)

    //Create the Schema for the DataFrame
    val schema = StructType(List(
      StructField("lat", DoubleType, nullable = true), //Latitude
      StructField("lon", DoubleType, nullable = true), //Longitude
      StructField("temp", DoubleType, nullable = true)))//Temperature

    //Create the DataFrame
    val recordDF = spark.createDataFrame(recordRDD, schema) 

然后我在纬度和经度上分组以获得平均温度

//From DataFrame to group by lat and lon and avg on temp
    recordDF.map(r => (r.getAs[Double]("lat"),
                       r.getAs[Double]("lon"),
                       r.getAs[Double]("temp")
                       )).groupBy($"lat", $"lon").agg(avg("temp")).
                       rdd.map(agg => (Location(agg.getAs[Double]("lat"), agg.getAs[Double]("lon")), agg.getAs[Double]("temp"))).collect()

我得到了这个例外:

org.apache.spark.sql.AnalysisException: Cannot resolve column name "lat" among (_1, _2, _3);

我尝试在列字符串文字之前添加$,从所有这些文件中删除$,但错误仍然相同。

printSchema()正确显示:

root
 |-- lat: double (nullable = true)
 |-- lon: double (nullable = true)
 |-- temp: double (nullable = true)

问题出在哪里,当我可以清楚地看到lat,lon和temp列为什么在groupBy调用时,它失败了?

1 个答案:

答案 0 :(得分:0)

问题是map功能。您将数据转换为Tuple3[Double, Double, Double],显然没有lonlat字段。效率也非常低。

相反只是:

recordDF.groupBy($"lat", $"lon").agg(avg("temp"))