2017-04-05 288 views
4

我想访问我的数据框中特定列的最小值和最大值,但我没有列的标题,只是它的编号,所以我应该我使用Scala?从特定列中获取最小值和最大值scala火花数据帧

也许是这样的:

val q = nextInt(ncol) //we pick a random value for a column number 
col = df(q) 
val minimum = col.min() 

很抱歉,如果这听起来像一个愚蠢的问题,但我找不到任何有关这个问题上,所以任何信息:/

回答

7

如何从元数据获得列名:

val selectedColumnName = df.columns(q) //pull the (q + 1)th column from the columns array 
df.agg(min(selectedColumnName), max(selectedColumnName)) 
5

您可以使用列号第一(通过索引df.columns)提取列名,然后汇总使用的列名:

val df = Seq((2.0, 2.1), (1.2, 1.4)).toDF("A", "B") 
// df: org.apache.spark.sql.DataFrame = [A: double, B: double] 

df.agg(max(df(df.columns(1))), min(df(df.columns(1)))).show 
+------+------+ 

|max(B)|min(B)| 
+------+------+ 
| 2.1| 1.4| 
+------+------+ 
7

可以使用模式匹配而分配变量:

import org.apache.spark.sql.functions.{min, max} 
import org.apache.spark.sql.Row 

val Row(minValue: Double, maxValue: Double) = df.agg(min(q), max(q)).head 

其中q可以是一个Column或列(字符串)的名称。假设你的数据类型是Double

+0

那是整齐的,要直接取值 –

0

这里是一个直接的方式来获得一个数据帧列名的最小值和最大值:

val df = Seq((1, 2), (3, 4), (5, 6)).toDF("A", "B") 

df.show() 
/* 
+---+---+ 
| A| B| 
+---+---+ 
| 1| 2| 
| 3| 4| 
| 5| 6| 
+---+---+ 
*/ 

df.agg(min("A"), max("A")).show() 
/* 
+------+------+ 
|min(A)|max(A)| 
+------+------+ 
|  1|  5| 
+------+------+ 
*/ 

如果你想获得的最小值和最大值作为独立变量,那么你可以转换的结果上面的agg()转换为并使用Row.getInt(index)获取的列值。

val min_max = df.agg(min("A"), max("A")).head() 
// min_max: org.apache.spark.sql.Row = [1,5] 

val col_min = min_max.getInt(0) 
// col_min: Int = 1 

val col_max = min_max.getInt(1) 
// col_max: Int = 5 
相关问题