複数の列によるデータのグループ化と集計
Spark DataFrame の groupBy メソッドを使用する場合、特定の列に対して集計操作を実行してデータを要約できます。 。ただし、結果の DataFrame には、グループ化された列と集計結果のみが含まれます。
この制限に対処し、集計とともに追加の列を取得するには、次の解決策を検討してください。
使用最初または最後の集計
1 つのアプローチは、first() または last() 集計関数を使用して、グループ化された DataFrame に追加の列を含めます。例:
df.groupBy(df("age")).agg(Map("name" -> "first", "id" -> "count"))
このクエリは、「age」、「name」、「count(id)」の 3 つの列を持つ DataFrame を作成します。 「name」列には各年齢グループの最初の値が含まれ、「count(id)」列には各年齢グループの「id」値の数が含まれます。
集計結果の結合
もう 1 つの解決策は、グループ化された列を結合キーとして使用して、集約された DataFrame を元の DataFrame に結合することです。このアプローチでは、元の DataFrame のすべての列が保持されます。
val aggregatedDf = df.groupBy(df("age")).agg(Map("id" -> "count")) val joinedDf = aggregatedDf.join(df, Seq("age"), "left")
結果の DataFrame "joinedDf" には、元の DataFrame のすべての列と、グループ化された DataFrame の "count(id)" 集計が含まれます。
ウィンドウ関数の使用
最後に、ウィンドウ関数を使用して、列を追加して groupBy の目的の動作をエミュレートすることもできます。以下に例を示します。
df.withColumn("rowNum", row_number().over(Window.partitionBy("age"))) .groupBy("age").agg(first("name"), count("id")) .select("age", "name", "count(id)")
このクエリは、各年齢グループ内の各レコードに行番号を割り当てるウィンドウ関数を作成します。次に、この行番号を使用して、「count(id)」集計とともに各年齢グループの最初に出現した「name」を取得します。
アプローチの選択は、特定の要件とパフォーマンスの考慮事項によって異なります。あなたのアプリケーション。
以上がgroupBy を使用して Spark DataFrame でデータを集計するときにすべての列を保持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。