在下面的方法中,我尝试对输入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调用时,它失败了?
答案 0 :(得分:0)
问题是map
功能。您将数据转换为Tuple3[Double, Double, Double]
,显然没有lon
或lat
字段。效率也非常低。
相反只是:
recordDF.groupBy($"lat", $"lon").agg(avg("temp"))