Apache spark PySpark collect_集合中不保留顺序,仅用于字符串列

Apache spark PySpark collect_集合中不保留顺序,仅用于字符串列,apache-spark,hadoop,pyspark,cloudera,window-functions,Apache Spark,Hadoop,Pyspark,Cloudera,Window Functions,我在数据帧上使用collect_set方法并添加了3列 我的df如下所示: 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

我在数据帧上使用collect_set方法并添加了3列

我的df如下所示:

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_编号和cust_id是正确的,但acc_名称的顺序不正确。 acc_no 111对应于acc_名称ABC,但我们得到的是XYZ。

有人能告诉我为什么会发生这种情况,解决办法是什么吗

我怀疑这个问题只发生在字符串列上,但我可能错了。 请帮忙

这类似于下面的线程,但我仍然得到一个错误


我们可以在id列中使用row\u number函数,并使用collect\u list&sorted\u数组来保留顺序

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) `````

集合
在性质上是无序的。什么版本的pyspark?在2.4+中,您可以使用
collect\u list
with。我正在使用spark 2.3.1,我想在这里提到的是,出于特定的原因,我已经将所有列类型化为字符串。