web-dev-qa-db-ja.com

特定の列scala sparkデータフレームから最小値と最大値を取得します

データフレームから特定の列の最小値と最大値にアクセスしたいのですが、列のヘッダーがなく、その番号だけがあるため、scalaを使用する必要がありますか?

多分このようなもの:

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

これはばかげた質問のように聞こえても申し訳ありませんが、この質問に関するSOの情報が見つかりませんでした:/

18
Laure D

メタデータから列名を取得する方法は次のとおりです。

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

変数の割り当て中にパターンマッチングを使用できます。

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または列の名前(String)です。データ型がDoubleであると仮定します。

21
Tautvydas

列番号を使用して最初に列名を抽出し(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|
+------+------+
6
Psidom

以下は、列名を持つデータフレームから最小値と最大値を取得する直接的な方法です。

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に変換し、Row.getInt(index)を使用してRowの列値を取得できます。

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