【问题标题】:Spark DataFrame groupBy and sort in the descending order (pyspark)Spark DataFrame groupBy并按降序排序(pyspark)
【发布时间】:2016-04-03 13:03:07
【问题描述】:

我正在使用 pyspark(Python 2.7.9/Spark 1.3.1) 并有一个数据框 GroupObject,我需要按降序过滤和排序。试图通过这段代码来实现它。

group_by_dataframe.count().filter("`count` >= 10").sort('count', ascending=False)

但它会引发以下错误。

sort() got an unexpected keyword argument 'ascending'

【问题讨论】:

    标签: python apache-spark dataframe pyspark apache-spark-sql


    【解决方案1】:

    在 PySpark 1.3 sort 方法不采用升序参数。您可以改用desc 方法:

    from pyspark.sql.functions import col
    
    (group_by_dataframe
        .count()
        .filter("`count` >= 10")
        .sort(col("count").desc()))
    

    desc函数:

    from pyspark.sql.functions import desc
    
    (group_by_dataframe
        .count()
        .filter("`count` >= 10")
        .sort(desc("count"))
    

    这两种方法都可以与 Spark >= 1.3(包括 Spark 2.x)一起使用。

    【讨论】:

      【解决方案2】:

      使用orderBy

      df.orderBy('column_name', ascending=False)
      

      完整答案:

      group_by_dataframe.count().filter("`count` >= 10").orderBy('count', ascending=False)
      

      http://spark.apache.org/docs/2.0.0/api/python/pyspark.sql.html

      【讨论】:

        【解决方案3】:

        到目前为止,最方便的方法是使用这个:

        df.orderBy(df.column_name.desc())
        

        不需要特殊的导入。

        【讨论】:

        • 感谢 Daniel Haviv 一位 Databricks 的解决方案架构师,他向我展示了这种方式。
        • 到目前为止最好的答案在这里。
        • 这应该是公认的答案。更简单,不依赖包(可能当时不可用)
        • 我真的很喜欢这个答案,但在 spark 3.0.0 中计数对我不起作用。我认为是因为 count 是一个函数而不是一个数字。 TypeError:参数无效,不是字符串或列: 类型的 。对于列文字,请使用“lit”、“array”、“struct”或“create_map”函数。
        【解决方案4】:

        你也可以使用 groupBy 和 orderBy 如下

        dataFrameWay = df.groupBy("firstName").count().withColumnRenamed("count","distinct_name").sort(desc("count"))
        

        【讨论】:

        • 为什么要先重命名列,然后使用旧名称进行排序?重命名甚至不是问题的一部分
        • @Sheldore 我正在重命名列名以优化性能,同时使用聚合查询,Spark 很难维护新添加列的元数据
        【解决方案5】:

        在 pyspark 2.4.4 中

        1) group_by_dataframe.count().filter("`count` >= 10").orderBy('count', ascending=False)
        
        2) from pyspark.sql.functions import desc
           group_by_dataframe.count().filter("`count` >= 10").orderBy('count').sort(desc('count'))
        

        无需导入 1) 和 1) 简短易读,
        所以我更喜欢 1) 而不是 2)

        【讨论】:

        • 为什么在 2) 中的相同答案中同时使用 orderBy 和 sort?
        猜你喜欢
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        • 2015-01-17
        • 2021-04-23
        • 2022-10-12
        • 2017-01-09
        • 2015-07-31
        • 1970-01-01
        相关资源
        最近更新 更多