我这里有一张火花放电数据,就像下面的图片。我想每两行进行一次分组,但在某种程度上:
就像这样:
---CustomerID--previous_stockcodes----stock_codes-----
不使用价格和数量,前一篮子和现有篮子放在一起。例如,CustomerID 12347
的第一行是:
12347----[85116, 22375, 71...]-----[84625A, 84625C, ...]
我已经编写了循环来完成这个任务,但是这样做的效率很低,而且速度很慢。我想知道我是否能高效地使用火花放电来做一些事情,但我很难弄清楚。提前谢谢
发布于 2017-08-13 08:54:27
您可以通过使用spark提供的lead
函数获得下一行。
lead
是一个窗口函数。
语法:lead(**column_name
**,**int_value
**,**default_value
**) over ( column_name按column_name顺序进行分区)
int_value
从当前行获取要引导的行数。
当找不到前导行时,default_value
接受输入
>>> 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|
+----------+---------+----------------+----------------+
https://stackoverflow.com/questions/45653152
复制相似问题