Pad*_*123 4 python group-by dataframe apache-spark pyspark
我有下面的 pyspark 数据框。
Column_1 Column_2 Column_3 Column_4
1 A U1 12345
1 A A1 549BZ4G
Run Code Online (Sandbox Code Playgroud)
预期输出:
对第 1 列和第 2 列进行分组。收集设置的第 3 列和第 4 列,同时保留输入数据帧中的顺序。它应该与输入的顺序相同。第 3 列和第 4 列之间的排序不存在依赖性。两者都必须保留输入数据帧排序
Column_1 Column_2 Column_3 Column_4
1 A U1,A1 12345,549BZ4G
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的:
我首先尝试使用窗口方法。我按第 1 列和第 2 列进行分区,并按第 1 列和第 2 列进行排序。然后按第 1 列和第 2 列进行分组,并在第 3 列和第 4 列上进行收集集。
我没有得到预期的输出。我的结果如下。
Column_1 Column_2 Column_3 Column_4
1 A U1,A1 549BZ4G,12345
Run Code Online (Sandbox Code Playgroud)
我还尝试使用单调递增的 id 创建索引,然后按索引排序,然后进行分组并收集集合以获取输出。但仍然没有运气。
是由于字母数字和数值吗?如何保留输入中第 3 列和第 4 列的顺序,而不更改顺序。
使用monotically_increasing_idSpark 的函数来维护顺序。您可以在此处找到有关它的更多信息
#InputDF
# +----+----+----+-------+
# |col1|col2|col3| col4|
# +----+----+----+-------+
# | 1| A| U1| 12345|
# | 1| A| A1|549BZ4G|
# +----+----+----+-------+
df1 = df.withColumn("id", F.monotonically_increasing_id()).groupby("Col1", "col2").agg(F.collect_list("col4").alias("Col4"),F.collect_list("col3").alias("Col3"))
df1.select("col1", "col2",F.array_join("col3", ",").alias("col3"),F.array_join("col4", ",").alias("col4")).show()
# OutputDF
# +----+----+-----+-------------+
# |col1|col2| col3| col4|
# +----+----+-----+-------------+
# | 1| A|U1,A1|12345,549BZ4G|
# +----+----+-----+-------------+
Run Code Online (Sandbox Code Playgroud)
使用array_distincton top ofcollect_list可以具有不同的值并维持顺序。
#InputDF
# +----+----+----+-------+
# |col1|col2|col3| col4|
# +----+----+----+-------+
# | 1| A| U1| 12345|
# | 1| A| A1|549BZ4G|
# | 1| A| U1|123456 |
# +----+----+----+-------+
df1 = df.withColumn("id", F.monotonically_increasing_id()).groupby("Col1", "col2").agg(
F.array_distinct(F.collect_list("col4")).alias("Col4"),F.array_distinct(F.collect_list("col3")).alias("Col3"))
df1.select("col1", "col2", F.array_join("col3", ",").alias("col3"), F.array_join("col4", ",").alias("col4")).show(truncate=False)
# +----+----+-----+---------------------+
# |col1|col2|col3 |col4 |
# +----+----+-----+---------------------+
# |1 |A |U1,A1|12345,549BZ4G,123456 |
# +----+----+-----+---------------------+
Run Code Online (Sandbox Code Playgroud)