webdevqa.jp.net

Spark 1.6のウィンドウ集計でcollect_setおよびcollect_list関数を使用する方法

Spark 1.6.0/Scalaでは、collect_list("colC")またはcollect_set("colC").over(Window.partitionBy("colA").orderBy("colB")を取得する機会はありますか?

12
Dzmitry Haikov

あなたがdataframeを持っていると仮定すると

+----+----+----+
|colA|colB|colC|
+----+----+----+
|1   |1   |23  |
|1   |2   |63  |
|1   |3   |31  |
|2   |1   |32  |
|2   |2   |56  |
+----+----+----+

以下を実行することにより、Window関数を実行できます。

import org.Apache.spark.sql.functions._
import org.Apache.spark.sql.expressions._
df.withColumn("colD", collect_list("colC").over(Window.partitionBy("colA").orderBy("colB"))).show(false)

結果:

+----+----+----+------------+
|colA|colB|colC|colD        |
+----+----+----+------------+
|1   |1   |23  |[23]        |
|1   |2   |63  |[23, 63]    |
|1   |3   |31  |[23, 63, 31]|
|2   |1   |32  |[32]        |
|2   |2   |56  |[32, 56]    |
+----+----+----+------------+

collect_setの結果も同様です。ただし、最後のset内の要素の順序は、collect_listの場合とは異なります

df.withColumn("colD", collect_set("colC").over(Window.partitionBy("colA").orderBy("colB"))).show(false)
+----+----+----+------------+
|colA|colB|colC|colD        |
+----+----+----+------------+
|1   |1   |23  |[23]        |
|1   |2   |63  |[63, 23]    |
|1   |3   |31  |[63, 31, 23]|
|2   |1   |32  |[32]        |
|2   |2   |56  |[56, 32]    |
+----+----+----+------------+

以下のようにorderByを削除した場合

df.withColumn("colD", collect_list("colC").over(Window.partitionBy("colA"))).show(false)

結果は

+----+----+----+------------+
|colA|colB|colC|colD        |
+----+----+----+------------+
|1   |1   |23  |[23, 63, 31]|
|1   |2   |63  |[23, 63, 31]|
|1   |3   |31  |[23, 63, 31]|
|2   |1   |32  |[32, 56]    |
|2   |2   |56  |[32, 56]    |
+----+----+----+------------+

答えがお役に立てば幸いです

21
Ramesh Maharjan