Apache spark Pyspark-每2行合并2行2个

Apache spark Pyspark-每2行合并2行2个,apache-spark,pyspark,Apache Spark,Pyspark,我这里有一个pyspark数据框,如下图所示。我希望每两行分组一次,但方式如下: 第一行将是第1行和第2行中的用户,并且 第二行将来自第2行和第3行等 大概是这样的: ---CustomerID--previous_stockcodes----stock_codes----- 不使用价格和数量,前一篮子和当前篮子放在一起。例如,CustomerID 12347的第一行是: 12347----[85116, 22375, 71...]-----[84625A, 84625C, ...] 我

我这里有一个pyspark数据框,如下图所示。我希望每两行分组一次,但方式如下:

  • 第一行将是第1行和第2行中的用户,并且
  • 第二行将来自第2行和第3行等
大概是这样的:

---CustomerID--previous_stockcodes----stock_codes-----
不使用价格和数量,前一篮子和当前篮子放在一起。例如,CustomerID 12347的第一行是:

12347----[85116, 22375, 71...]-----[84625A, 84625C, ...]
我已经编写了循环来实现这一点,但这确实是低效和缓慢的。我想知道我是否可以使用pyspark高效地做类似的事情,但我很难弄清楚这一点。提前多谢


您可以使用spark sql提供的
lead
函数获取下一行

lead
是一个窗口功能

语法:引导(
column\u name
int\u value
default\u value
)超过(按列名称划分顺序按列名称划分)

int\u value
从当前行中获取要引导的行数

default\u值
在找不到前导行时接受大小写输入

>>> input_df.show()
+----------+---------+----------------+
|customerID|invoiceNo|  stockCode_list|
+----------+---------+----------------+
|     12347|   537626|  [85116, 22375]|
|     12347|   542237|[84625A, 84625C]|
|     12347|   549222|  [22376, 22374]|
|     12347|   556201|  [23084, 23162]|
|     12348|   539318|  [84992, 22951]|
|     12348|   541998|  [21980, 21985]|
|     12348|   548955|  [23077, 23078]|
+----------+---------+----------------+

>>> from pyspark.sql.window import Window
>>> from pyspark.sql.functions import lead,col

>>> win_func = Window.partitionBy("customerID").orderBy("invoiceNo")
>>> new_col = lead("stockCode_list",1,None).over(win_func)
>>> req_df = input_df.select(col("customerID"),col("invoiceNo"),col("stockCode_list"),new_col.alias("req_col"))
>>> req_df.orderBy("customerID","invoiceNo").show()
+----------+---------+----------------+----------------+
|customerID|invoiceNo|  stockCode_list|         req_col|
+----------+---------+----------------+----------------+
|     12347|   537626|  [85116, 22375]|[84625A, 84625C]|
|     12347|   542237|[84625A, 84625C]|  [22376, 22374]|
|     12347|   549222|  [22376, 22374]|  [23084, 23162]|
|     12347|   556201|  [23084, 23162]|            null|
|     12348|   539318|  [84992, 22951]|  [21980, 21985]|
|     12348|   541998|  [21980, 21985]|  [23077, 23078]|
|     12348|   548955|  [23077, 23078]|            null|
+----------+---------+----------------+----------------+

你想根据CustomerId分组还是不考虑CustomerId只分组两行?我需要将它们转换为训练集。是的,它是由CustomerID生成的,例如客户A的第1行和第2行,客户A的第2行和第3行等等