【发布时间】:2019-08-29 09:49:02
【问题描述】:
给定一个带有索引列(“Z”)的数据框:
val tmp= Seq(("D",0.1,0.3, 0.4), ("E",0.3, 0.1, 0.4), ("F",0.2, 0.2, 0.5)).toDF("Z", "a", "b", "c")
+---+---+---+---+
| Z | a| b| c|
---+---+---+---+
| "D"|0.1|0.3|0.4|
| "E"|0.3|0.1|0.4|
| "F"|0.2|0.2|0.5|
+---+---+---+---+
说我对 Z = "D" 的第一行感兴趣:
tmp.filter(col("Z")=== "D")
+---+---+---+---+
| Z | a| b| c|
+---+---+---+---+
|"D"|0.1|0.3|0.4|
+---+---+---+---+
如何在保留索引列的同时获取该 Dataframe 行的最小值和最大值及其对应的列名?
如果我想要前 2 个最大值,则需要输出
+---+---+---
| Z | b|c |
+---+---+--+
| D |0.3|0.4|
+---+---+---
如果我想要 min 所需的输出
+---+---+
| Z | a|
+---+---+
| D |0.1|
+---+---+
我尝试了什么:
// first convert that DF to an array
val tmp = df.collect.map(_.toSeq).flatten
// returns
tmp: Array[Any] = Array(0.1, 0.3, 0.4) <---dont know why Any is returned
//take top values of array
val n = 1
tmp.zipWithIndex.sortBy(-_._1).take(n).map(_._2)
但出现错误:
No implicit Ordering defined for Any.
有什么方法可以直接从数据框而不是数组中完成?
【问题讨论】:
-
能否请您提供有关所需输出的更多详细信息,并让我知道什么是 df Dataframe 和什么是 tmp dataframe?
-
@Nikk 更新 t0 反映所需的输出
标签: scala dataframe apache-spark apache-spark-sql