Я хочу вычислить процент от общего количества и сохранить его в новом столбце строки данных PYspark: - PullRequest
0 голосов
/ 01 сентября 2018

Данные должны выглядеть так:

product total_spend needed

a        10          10%          

a        20          20%

a        30          30%

b        30          30%

b        10          10%

код использует, но не работает:

df.withColumn('needed',df['total_spend']/F.sum(df['total_spend'])).show()

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Возможность:

import org.apache.spark.sql.expressions._
import org.apache.spark.sql.functions._

val df = sc.parallelize(Seq(
   ("A", "X", 2, 100), ("A", "X", 7, 100), ("B", "X", 10, 100),
   ("C", "X", 1, 100), ("D", "X", 50, 100), ("E", "X", 30, 100)
    )).toDF("c1", "c2", "Val1", "Val2")

val df2 = df
   .groupBy("c1")
   .agg(sum("Val1").alias("sum"))
   .withColumn("fraction", col("sum") /  sum("sum").over())

 df2.show
0 голосов
/ 02 сентября 2018

Пожалуйста, найдите ответ ниже.

df.withColumn("needed",concat(df.col("total_spend").multiply(100)/df.agg(sum(col("total_spend"))).first.mkString.toInt,lit("%"))).show()
0 голосов
/ 01 сентября 2018

Spark не работает таким образом, сначала вы должны собрать данные, а затем использовать их для расчета процентов. Ниже приведен пример кода для того же, есть и другие способы, такие как:

sum_spend = df.agg(F.sum(F.col("total_spend")).alias("sum_spend")).collect()[0][0]

df.withColumn(
    "needed",
    F.concat((F.col("total_spend")*100.0/F.lit(sum_spend)), F.lit("%"))
).show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...