あなたは次にあなたがtopFilters
配列をループして、必要なdataframe
を作成することができます
val topFilters = Array(100, 200, 300) // you can add more
としての限界のArray
を作成することができます。 join
の代わりにunion
を使用することをお勧めします。join
は、別途columns
とunions
となり、別途rows
となります。あなたのdataframe
あなたはあなたの最終dataframe
+------+-------------+-------------+-------------+ |rowNum|total_sum_100|total_sum_200|total_sum_300| +------+-------------+-------------+-------------+ |1 |923 |1773 |3473 | +------+-------------+-------------+-------------+
などを与える必要がありますどの
import sqlContext.implicits._
import org.apache.spark.sql.functions._
var finalDF : DataFrame = Seq("1").toDF("rowNum")
for(k <- topFilters) {
val top_100_data = df.select(lit("1").as("rowNum"), sum(when(col("score") > 0 && col("row_number") < k, col("values"))).alias(s"total_sum_$k"))
finalDF = finalDF.join(top_100_data, Seq("rowNum"))
}
finalDF.show(false)
上記のように定義topFilters
配列を使用して行うことができます
+----+------+-----+----------+
|name|values|score|row_number|
+----+------+-----+----------+
|A |1000 |0 |1 |
|B |947 |0 |2 |
|C |923 |1 |3 |
|D |900 |2 |200 |
|E |850 |3 |150 |
|F |800 |1 |250 |
+----+------+-----+----------+
として考えると、次の
を行うことができます
あなたあなたが持っているあなたの25の限界のために同じことをすることができます。
union
を使用する場合は、上記の考え方に似ています。
私の答えは、あなたが労働組合を必要とする場合、あなたはあなたの
を与える必要があります
var finalDF : DataFrame = Seq((0, 0, 0, 0)).toDF("limit", "count", "sum_filtered", "total_sum")
for(k <- topFilters) {
val top_100_data = df.select(lit(k).as("limit"), count(when(col("score") > 0 and col("row_number")<=k, col("values"))).alias("count"),
sum(when(col("score") > 0 and col("row_number")<=k, col("values"))).alias("sum_filtered"),
sum(when(col("row_number") <=k, col("values"))).alias("total_sum"))
finalDF = finalDF.union(top_100_data)
}
finalDF.filter(col("limit") =!= 0).show(false)
上で定義された同じ制限アレイと、次のロジックを適用することができ
を更新役立つ
であると思います
+-----+-----+------------+---------+ |limit|count|sum_filtered|total_sum| +-----+-----+------------+---------+ |100 |1 |923 |2870 | |200 |3 |2673 |4620 | |300 |4 |3473 |5420 | +-----+-----+------------+---------+
こんにちは!答えてくれてありがとう、これはとても役に立ちました!!だから私はすべてのK(sum_100_filtered_score、total_sum_100、count_filtered_score_100)の3つの列が必要になります。データセットに参加することで、各フィールドに1つの列が得られます。だから私は組合を使ってみようとしているのです – Vignesh
それでは。 :)結合の代わりに、あなたは共用体を使うことができます。 –
私の更新された答えを見てください:)あなたが本当にあなたを助けた場合、あなたは受け入れてupvoteすることができます –