私は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
groupBy
式は同じであるため、count()
はagg()
内で使用できます。
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)
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")
と等しい最初の列でレコードをカウントします
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)