【发布时间】:2018-03-10 08:49:36
【问题描述】:
背景:
我有一个包含三列的数据框:id, x, y。 x,y 是双倍的。
- 首先我
struct (col("x"),col("y"))获取坐标列。 - 然后
groupBy(col("id"))和agg(collect_list(col("coordinate")))
所以现在 df 只有两列:id ,coordinate。
我认为坐标的数据类型是collection.mutable.WrappedArray[(Double,Double)]。
所以我把它传给了udf。但是,数据类型是错误的。运行代码时出现错误。我不知道为什么。 struct(col1,col2) 的真正数据类型是什么?或者有没有其他方法可以轻松得到正确答案?
这是代码:
def getMedianPoint = udf((array1: collection.mutable.WrappedArray[(Double,Double)]) => {
var l = (array1.length/2)
var c = array1(l)
val x = c._1.asInstanceOf[Double]
val y = c._2.asInstanceOf[Double]
(x,y)
})
df.withColumn("coordinate",struct(col("x"),col("y")))
.groupBy(col("id"))
.agg(collect_list("coordinate").as("coordinate")
.withColumn("median",getMedianPoint(col("coordinate")))
非常感谢!
【问题讨论】:
-
所以数据类型应该是 Seq[Row] 基于 Ramesh Maharjan 的回答。
标签: apache-spark apache-spark-sql apache-spark-dataset