web-dev-qa-db-ja.com

spark / scalaのデータフレームの1つの列の値を合計する方法

タイムスタンプ、ステップ、心拍数などの多くの列があるCSVファイルから読み取るデータフレームがあります。

たとえば、「steps」列のステップの合計数など、各列の値を合計します。

私が見る限り、私はこれらの種類の関数を使用したい: http://spark.Apache.org/docs/latest/api/scala/index.html#org.Apache.spark.sql.functions$

しかし、関数sumの使用方法は理解できます。

私が次のように書くとき:

val df = CSV.load(args(0))
val sumSteps = df.sum("steps") 

関数の合計を解決できません。

関数sumを誤って使用していませんか?最初に関数マップを使用する必要がありますか?そして、もしそうならどのように?

簡単な例は非常に役立ちます!最近Scalaを書き始めました。

21
Ectoras

1つの列のすべての値をsumしたい場合は、DataFrameの内部RDDおよびreduceを使用する方が効率的です。

import sqlContext.implicits._
import org.Apache.spark.sql.functions._

val df = sc.parallelize(Array(10,2,3,4)).toDF("steps")
df.select(col("steps")).rdd.map(_(0).asInstanceOf[Int]).reduce(_+_)

//res1 Int = 19
18

最初に関数をインポートする必要があります。

import org.Apache.spark.sql.functions._

その後、次のように使用できます。

val df = CSV.load(args(0))
val sumSteps =  df.agg(sum("steps")).first.get(0)

必要に応じて結果をキャストすることもできます。

val sumSteps: Long = df.agg(sum("steps").cast("long")).first.getLong(0)

編集:

複数の列(「col1」、「col2」など)の場合、すべての集計を一度に取得できます。

val sums = df.agg(sum("col1").as("sum_col1"), sum("col2").as("sum_col2"), ...).first

Edit2:

集計を動的に適用するために、次のオプションを使用できます。

  • すべての数値列に一度に適用する:
df.groupBy().sum()
  • 数値列名のリストに適用する:
val columnNames = List("col1", "col2")
df.groupBy().sum(columnNames: _*)
  • エイリアスやキャストを含む数値列名のリストに適用する:
val cols = List("col1", "col2")
val sums = cols.map(colName => sum(colName).cast("double").as("sum_" + colName))
df.groupBy().agg(sums.head, sums.tail:_*).show()
78
Daniel de Paula

集計関数Sumを列に適用するだけです

df.groupby('steps').sum().show()

ドキュメントに従ってください http://spark.Apache.org/docs/2.1.0/api/python/pyspark.sql.html

このリンクもご覧ください https://www.analyticsvidhya.com/blog/2016/10/spark-dataframe-and-operations/

5
shankarj67

この質問が尋ねられたとき、これが周りにあったかどうかはわかりませんが、:

df.describe().show("columnName")

列の平均、カウント、stdtev統計を提供します。 .show()を実行すると、すべての列で返されると思います

1
Marcos

spark sqlクエリを使用します。

import org.Apache.spark.sql.SparkSession 
import org.Apache.spark.SparkConf 
import org.Apache.spark.sql.functions._ 
import org.Apache.spark.SparkContext 
import Java.util.stream.Collectors

val conf = new SparkConf().setMaster("local[2]").setAppName("test")
val spark = SparkSession.builder.config(conf).getOrCreate()
val df = spark.sparkContext.parallelize(Seq(1, 2, 3, 4, 5, 6, 7)).toDF()

df.createOrReplaceTempView("steps")
val sum = spark.sql("select  sum(steps) as stepsSum from steps").map(row => row.getAs("stepsSum").asInstanceOf[Long]).collect()(0)
println("steps sum = " + sum) //prints 28
0
Omkar