[解決済み] データフレームを複数回グループ化する
2022-02-19 02:50:06
質問
val df = (Seq((1, "a", "10"),(1,"b", "12"),(1,"c", "13"),(2, "a", "14"),
(2,"c", "11"),(1,"b","12" ),(2, "c", "12"),(3,"r", "11")).
toDF("col1", "col2", "col3"))
そこで、3つのカラムを持つspark dataframeを持っています。
+----+----+----+
|col1|col2|col3|
+----+----+----+
| 1| a| 10|
| 1| b| 12|
| 1| c| 13|
| 2| a| 14|
| 2| c| 11|
| 1| b| 12|
| 2| c| 12|
| 3| r| 11|
+----+----+----+
私の要件は、実際には、私は以下の説明のように2つのレベルのgroupbyを実行する必要があります。
レベル1: col1 で groupby を行い、col3 の合計を行う場合。以下の2つのカラムが得られます。 1. col1 2. 合計(col3) ここで、col2が抜けてしまいます。
レベル2 col1、col2を再度group byし、col3のsumを求めると、以下の3つのカラムが得られます。 1. col1 2. col2 3. 合計(col3)
私の要件は、実際には2つのレベルのgroupByを実行し、最終的に1つのデータフレームにこれらの2つの列(レベル1のsum(col3)、レベル2のsum(col3))を持つ必要があることです。
どうすればいいのでしょうか、どなたか説明してください。
スパーク : 1.6.2 スカラ : 2.10
解決方法は?
1つの方法として、2つの合計を別々に行い、それらを再び結合することができます。
(df.groupBy("col1", "col2").agg(sum($"col3").as("sum_level2")).
join(df.groupBy("col1").agg(sum($"col3").as("sum_level1")), Seq("col1")).show)
+----+----+----------+----------+
|col1|col2|sum_level2|sum_level1|
+----+----+----------+----------+
| 2| c| 23.0| 37.0|
| 2| a| 14.0| 37.0|
| 1| c| 13.0| 47.0|
| 1| b| 24.0| 47.0|
| 3| r| 11.0| 11.0|
| 1| a| 10.0| 47.0|
+----+----+----------+----------+
また、level1_sum が level2_sum のグループ化された和であることを考慮し、窓関数を使用する方法もあります。
col1
:
import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy($"col1")
(df.groupBy("col1", "col2").agg(sum($"col3").as("sum_level2")).
withColumn("sum_level1", sum($"sum_level2").over(w)).show)
+----+----+----------+----------+
|col1|col2|sum_level2|sum_level1|
+----+----+----------+----------+
| 1| c| 13.0| 47.0|
| 1| b| 24.0| 47.0|
| 1| a| 10.0| 47.0|
| 3| r| 11.0| 11.0|
| 2| c| 23.0| 37.0|
| 2| a| 14.0| 37.0|
+----+----+----------+----------+
関連
-
[解決済み] java.lang.NoClassDefFoundError: scala/Product$class
-
[解決済み] Scalaでステートメントの間にN秒待つには?
-
[解決済み] 実行時に変数の型を取得したい
-
[解決済み] ScalaのバージョンをScala本体から取得するにはどうしたらいいですか?
-
[解決済み】ScalaのHigher kinded typeとは何ですか?
-
[解決済み】Scalaでリスト内のアイテムを取得する?
-
[解決済み】ScalaでVectorを選択するのはどんなとき?
-
[解決済み] 型の論理和(ユニオン型)はどのように定義するのですか?
-
[解決済み] Scalaは、コレクションをMap-by-keyに変換する最良の方法ですか?
-
[解決済み] Scalaのパターンマッチングシステムで比較演算子を使う
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Spark - アプリの投稿時に「設定にマスターURLが設定されている必要があります」というエラーが発生する
-
[解決済み] AWSのためのScala SDKまたはインターフェースはありますか?
-
[解決済み] Scalaで定数メンバを定義するには?
-
[解決済み] sbtのlibraryDependenciesで言うところの++=と+=の違いは何ですか?
-
[解決済み] 理解する `andThen`
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み】Scalaでケースクラスのインスタンスをクローンして、1つのフィールドだけを変更するにはどうすればよいですか?
-
[解決済み】Scalaのウェブフレームワークは何がありますか?[クローズド]
-
[解決済み】Scalaのyieldとは何ですか?
-
[解決済み] データセットにカスタムオブジェクトを格納する方法は?