Pyspark orderBy 在对多列进行排序时给出不正确的结果

Posted

技术标签:

【中文标题】Pyspark orderBy 在对多列进行排序时给出不正确的结果【英文标题】:Pyspark orderBy giving incorrect results when sorting on more than one column 【发布时间】:2019-11-13 02:25:14 【问题描述】:

概述:我正在尝试按多列对火花 DF 进行排序,而生成的 DF 仅按一列排序。

预期结果:在每个公司中名称按字母顺序排序的 DF。

玩具 DF:

l = [('Alice', 1,'funcompany'),
      ('Bob',5,'funcompany'),
       ('Jane',30,'Amazon'),
        ('Kenneth',2,'lameplace'),
          ('Dill',10,'funcompany'),
            ('Zeb',0,'lameplace'),
              ('Archie',50,'funcompany'),
                ('Debra',0,'funcompany'),
                  ('Vicky',24,'funcompany'),
                    ('Kanye',40,'lameplace')]

datis=sqlContext.createDataFrame(l, ['name', 'age','company'])

排序:

colss = ["name", "company"]

datis.orderBy(colss,ascending=[1,0]).show()

【问题讨论】:

尝试使用布尔值列表而不是整数。不确定它是否会有所帮助。或者,只需执行orderBy(F.asc('name'), F.desc('company')) 这是预期的,因为第一列中没有欺骗/关系。仅当第一列具有相同的值时才应用第二列排序。 @absolutelydevastated "datis.orderBy(F.asc('name'), F.asc('company')).show()" 似乎给出了同样的问题。您可以使用布尔值列表而不是整数来扩展一点吗?谢谢。 @jxc 只是为了确认一下,您是说不能使用“orderBy”按多列排序? 不,您当然可以按多列排序,但 orderBy 列表中的第一列始终优先。如果通过比较第一列来确定顺序,则简单地忽略第二列和后面的列。您可以更改示例的前 4 行并将名称全部设置为 Alice 看看会发生什么 【参考方案1】:

添加

import pyspark.sql.functions as F

改变

colss = ["name", "company"]
datis.orderBy(colss,ascending=[1,0]).show()

datis.orderBy(F.desc('company'), F.asc('name')).show()

给出想要的结果

【讨论】:

【参考方案2】:

试试下面的代码

cols = ["name", "company"]
datis.orderBy(cols, ascending=False)

【讨论】:

以上是关于Pyspark orderBy 在对多列进行排序时给出不正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

使用 Doctrine 按多列排序

Pyspark - 多列聚合

SQL 多列排序

SQL 多列排序

在 Pyspark 中,如何在 partitionBy 和 orderBy 之后进行分组?

Sql--通过order by 语句进行排序: