web-dev-qa-db-ja.com

集約関数SparkのgroupByで使用量をカウント

私はpySparkの1行のコードで複数の操作をしようとしていますが、それが私の場合に可能かどうかはわかりません。

私の意図は、出力を新しいデータフレームとして保存する必要がないことです。

私の現在のコードはかなり単純です:

encodeUDF = udf(encode_time, StringType())
new_log_df.cache().withColumn('timePeriod', encodeUDF(col('START_TIME')))
  .groupBy('timePeriod')
  .agg(
    mean('DOWNSTREAM_SIZE').alias("Mean"),
    stddev('DOWNSTREAM_SIZE').alias("Stddev")
  )
  .show(20, False)

私の意図は、groupByを使用した後にcount()を追加して、timePeriod列の各値に一致するレコードのカウントを取得することです。

groupBy(..).count().agg(..)を使用しようとすると、例外が発生します。

コードを2行のコマンドに分割せずに、count()agg()の両方を達成する方法はありますか。show() :

new_log_df.withColumn(..).groupBy(..).count()
new_log_df.withColumn(..).groupBy(..).agg(..).show()

さらに良いことに、agg.show()出力にマージされた出力を取得するために-行の値に一致するレコードのカウント数を示す追加の列。例えば。:

timePeriod | Mean | Stddev | Num Of Records
    X      | 10   |   20   |    315
29
Adiel

groupBy式は同じであるため、count()agg()内で使用できます。

Pythonを使用

import pyspark.sql.functions as func

new_log_df.cache().withColumn("timePeriod", encodeUDF(new_log_df["START_TIME"])) 
  .groupBy("timePeriod")
  .agg(
     func.mean("DOWNSTREAM_SIZE").alias("Mean"), 
     func.stddev("DOWNSTREAM_SIZE").alias("Stddev"),
     func.count(func.lit(1)).alias("Num Of Records")
   )
  .show(20, False)

pySpark SQL関数ドキュメント

Scalaを使用

import org.Apache.spark.sql.functions._ //for count()

new_log_df.cache().withColumn("timePeriod", encodeUDF(col("START_TIME"))) 
  .groupBy("timePeriod")
  .agg(
     mean("DOWNSTREAM_SIZE").alias("Mean"), 
     stddev("DOWNSTREAM_SIZE").alias("Stddev"),
     count(lit(1)).alias("Num Of Records")
   )
  .show(20, false)

count(1)は、count("timePeriod")と等しい最初の列でレコードをカウントします

Javaで

import static org.Apache.spark.sql.functions.*;

new_log_df.cache().withColumn("timePeriod", encodeUDF(col("START_TIME"))) 
  .groupBy("timePeriod")
  .agg(
     mean("DOWNSTREAM_SIZE").alias("Mean"), 
     stddev("DOWNSTREAM_SIZE").alias("Stddev"),
     count(lit(1)).alias("Num Of Records")
   )
  .show(20, false)
52
mrsrinivas