Apache spark Pyspark-每2行合并2行2个
我这里有一个pyspark数据框,如下图所示。我希望每两行分组一次,但方式如下: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, ...] 我
- 第一行将是第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行等等