私は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()
私が使用することをお勧めしwindow
機能を。まず順ウィンドウを使用しrow_number
得るために、増分合計のをcol2
。incremental sum
必要があります3の倍数基本的に可能になりますエンドポイントのあなたが必要とするグループを。でそれらを交換し、同じウィンドウのラグあなたの得るために必要なパーティションをでincremental_sum
。今、あなたは可能GROUPBY incremental_sum
列をしてcollect_list
。次のことができますarray_join
(spark2.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|
+----------+