web-dev-qa-db-ja.com

Sparkで複数の列を合計する

Sparkで複数の列を合計するにはどうすればよいですか?たとえば、SparkRでは、次のコードが1つの列の合計を取得しますが、dfの両方の列の合計を取得しようとすると、エラーが発生します。

# Create SparkDataFrame
df <- createDataFrame(faithful)

# Use agg to sum total waiting times
head(agg(df, totalWaiting = sum(df$waiting)))
##This works

# Use agg to sum total of waiting and eruptions
head(agg(df, total = sum(df$waiting, df$eruptions)))
##This doesn't work

SparkRまたはPySparkコードのいずれかが機能します。

6
Gaurav Bansal
_org.Apache.spark.sql.functions.sum(Column e)
_

集計関数:式のすべての値の合計を返します。

ご覧のとおり、sumは入力として1列のみを使用するため、sum(df$waiting, df$eruptions)は機能しません。数値フィールドを合計したいので、dosum(df("waiting") + df("eruptions"))を実行できます。個々の列の値を合計したい場合は、df.agg(sum(df$waiting),sum(df$eruptions)).show

3
Balaji Devaraj

PySparkで、列を明示的に入力したくない場合:

from operator import add
from functools import reduce
new_df = df.withColumn('total',reduce(add, [F.col(x) for x in numeric_col_list]))
11
user2010808

あなたはpysparkで以下のようなことをすることができます

>>> from pyspark.sql import functions as F
>>> df = spark.createDataFrame([("a",1,10), ("b",2,20), ("c",3,30), ("d",4,40)], ["col1", "col2", "col3"])
>>> df.groupBy("col1").agg(F.sum(df.col2+df.col3)).show()
+----+------------------+
|col1|sum((col2 + col3))|
+----+------------------+
|   d|                44|
|   c|                33|
|   b|                22|
|   a|                11|
+----+------------------+
2
rogue-one

sparkRコード:

library(SparkR)
df <- createDataFrame(sqlContext,faithful)
w<-agg(df,sum(df$waiting)),agg(df,sum(df$eruptions))
head(w[[1]])
head(w[[2]])
1
midhunxavier