【问题标题】:How to use groupby and nth_value at the same time in pyspark?如何在pyspark中同时使用groupby和nth_value?
【发布时间】:2021-11-05 20:30:38
【问题描述】:

所以,我有一个包含一些重复数据的数据集,我需要将其删除。由于某种原因,我需要的数据总是在中间:

--> df_apps
DATE       |  APP       |  DOWNLOADS  |  ACTIVE_USERS
______________________________________________________
2021-01-10 |  FACEBOOK  |  1000       |  5000
2021-01-10 |  FACEBOOK  |  20000      |  900000
2021-02-10 |  FACEBOOK  |  9000       |  72000
2021-01-11 |  FACEBOOK  |  4000       |  2000
2021-01-11 |  FACEBOOK  |  40000      |  85000
2021-02-11 |  FACEBOOK  |  1000       |  2000

在 pandas 中,它就像 df_apps_grouped = df_apps.groupby('DATE').nth_value(1) 一样简单,我会得到下面的结果:

--> df_apps_grouped
DATE       |  APP       |  DOWNLOADS  |  ACTIVE_USERS
______________________________________________________
2021-01-10 |  FACEBOOK  |  20000      |  900000
2021-01-11 |  FACEBOOK  |  40000      |  85000

但是对于一个特定的项目,我必须使用 pyspark 并且我无法得到这个结果。 你能帮我解决这个问题吗?

谢谢!

【问题讨论】:

    标签: dataframe pyspark


    【解决方案1】:

    你会想要做的:

    from pyspark.sql import Window, functions as F
    
    w = Window.partitionBy('date').orderBy('date')
    df = df.withColumn('row_n', F.row_number().over(w)).filter('row_n ==1')
    

    由于其分布式特性,行的顺序是随机的,第二次查询时第 1 行可能会有所不同。这就是您需要订购的原因,这将确保您每次都得到相同的结果

    【讨论】:

      【解决方案2】:

      您要查找的是row_number 应用于由DATE 分区并由DATE 排序的窗口,但是由于spark 的分布式特性,我们不能保证在排序过程中

      2021-01-10 |  FACEBOOK  |  1000       |  5000
      

      总会来之前

      2021-01-10 |  FACEBOOK  |  20000      |  900000
      

      我建议,如果您正在从文件中读取,请包括一个行号,并根据文件号进行排序。请参考 here 在 Spark 中实现这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        • 2015-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多