PySparkを使用して行の値のパターンに基づいてレコードをグループ化します

スーリヤムラリ:

私は3列を持つテーブルを持っています:

Table A:

+----+----+----------+                                                          
|col1|col2|row_number|
+----+----+----------+
|   X|   1|         1|
|   Y|   0|         2|
|   Z|   2|         3|
|   A|   1|         4|
|   B|   0|         5|
|   C|   0|         6|
|   D|   2|         7|
|   P|   1|         8|
|   Q|   2|         9|
+----+----+----------+

私は「COL2」の値に基づいてレコードをグループ化することによって、「COL1」の文字列を連結します。あなたが使用することができます - 「col2が」私は「COL2」2と1と終わりで始まる(データフレームの順序を維持しなければならないしているグループレコードにしたい2に続く0の任意の数に続く1のパターンを、持っています注文のROW_NUMBER列)

例えば、最初の3つのレコードが「COL2」が持っているため、「1-0-2」一緒にグループ化することができます。彼らの「COL2」の値は「1-0-0-2」を持っているので、次の4つのレコードが一緒にグループ化することができます

連結部分は、Iグループの後にこれらのレコードを「CONCAT_WS」を使用して行うことができます。しかし、「1-0s-2」のパターンに基づいて、これらのレコードどのグループに上の任意のヘルプ?

予想される出力:

+----------+
|output_col|
+----------+
|       XYZ|   
|      ABCD|   
|        PQ| 
+----------+

あなたは、このサンプルデータを作成するために、次のコードを使用することができます。

schema = StructType([StructField("col1", StringType())\
                   ,StructField("col2", IntegerType())\
                   ,StructField("row_number", IntegerType())])

data = [['X', 1, 1], ['Y', 0, 2], ['Z', 2, 3], ['A', 1, 4], ['B', 0, 5], ['C', 0, 6], ['D', 2, 7], ['P', 1, 8], ['Q', 2, 9]]

df = spark.createDataFrame(data,schema=schema)
df.show()
モハマド・Murtaza Hashmiさん:

私が使用することをお勧めしwindow機能を。まず順ウィンドウを使用しrow_number得るために、増分合計のをcol2incremental sum必要があります3の倍数基本的に可能になりますエンドポイントあなたが必要とするグループをでそれらを交換し、同じウィンドウのラグあなたの得るために必要なパーティションをincremental_sum今、あなたは可能GROUPBY incremental_sum列をしてcollect_list次のことができますarray_joinspark2.4収集リスト上)、ご希望の文字列を取得します。

from pyspark.sql import functions as F 
from pyspark.sql.window import Window
w=Window().orderBy("row_number")
df.withColumn("incremental_sum", F.sum("col2").over(w))\
  .withColumn("lag", F.lag("incremental_sum").over(w))\
  .withColumn("incremental_sum", F.when(F.col("incremental_sum")%3==0, F.col("lag")).otherwise(F.col("incremental_sum")))\
  .groupBy("incremental_sum").agg(F.array_join(F.collect_list("col1"),"").alias("output_col")).drop("incremental_sum").show()
+----------+
|output_col|
+----------+
|       XYZ|
|      ABCD|
|        PQ|
+----------+

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=395725&siteId=1