我在Dataframe上使用collect\u set方法并添加了3列。
我的数据如下:
id acc_no acc_name cust_id
1 111 ABC 88
1 222 XYZ 99
下面是代码段:
from pyspark.sql import Window
import pyspark.sql.functions as F
w = Window.partitionBy('id').orderBy('acc_no')
df1 = df.withColumn(
'cust_id_new',
F.collect_set(cust_id).over(w)
).withColumn(
'acc_no_new',
F.collect_set(acc_no).over(w)
).withColumn(
'acc_name_new',
F.collect_set(acc_name).over(w)
).drop('cust_id').drop('acc_no').drop('acc_name')
在本例中,我的输出如下:
id acc_no acc_name cust_id
1 [111,222] [XYZ,ABC] [88,99]
所以在这里,acc\u no和cust\u id是正确的,但是acc\u name的顺序是错误的。acc\ U no 111对应于acc\ U名称,但我们得到的是xyz。
有人能告诉我为什么会发生这种情况,有什么解决办法吗?
我怀疑这个问题只发生在字符串列上,但我可能错了。请帮忙。。。
这是类似于下面的线程,但我仍然得到一个错误。
如何在pyspark collect\u list和collect multiple list中维护排序顺序
1条答案
按热度按时间uxhixvfz1#
我们可以在id列中使用row\ number函数,并使用collect\ list和sorted\ array来保持顺序。