order在pyspark collect\u集中仅为string列保留

rm5edbpk  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(384)

我在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中维护排序顺序

uxhixvfz

uxhixvfz1#

我们可以在id列中使用row\ number函数,并使用collect\ list和sorted\ array来保持顺序。

from pyspark.sql import Window
import pyspark.sql.functions as F

w = Window.partitionBy('id').orderBy('cust_id')
df1 = df.withColumn(
    'rn',
    row_number(cust_id).over(w)
).groupBy("id").agg(sort_array(collect_list(struct('rn','acc_no','acc_name','cust_id'))).alias('data')) \
.withColumn('grp_acc_no',col('data.acc_no')) \
.withColumn('grp_acc_name',col('data.acc_name')) \
.withColumn('grp_cust_id',col('data.cust_id')) \
.drop('data','acc_no','acc_name','cust_id').show(truncate=False) `````

相关问题