【问题标题】:Duplicate Rows in Pyspark DataFrame Dynamic Number of Times Based on Difference between Two Columns [duplicate]基于两列之间差异的Pyspark DataFrame动态次数重复行[重复]
【发布时间】:2019-02-08 00:27:51
【问题描述】:

我有一个 PySpark 数据框,如下所示:

+---+----+----+
| id|day1|day2|
+---+----+----+
|  1|   2|   4|
|  2|   1|   2|
|  3|   3|   3|
+---+----+----+

我想将每一行复制 n 次 n = day2 - day1。生成的数据框如下所示:

+---+----+----+
| id|day1|day2|
+---+----+----+
|  1|   2|   4|
|  1|   2|   4|
|  1|   2|   4|
|  2|   1|   2|
|  2|   1|   2|
|  3|   3|   3|
+---+----+----+

我该怎么做?

【问题讨论】:

    标签: python pyspark


    【解决方案1】:

    这是一种方法。

    from pyspark.sql import functions as F
    from pyspark.sql.types import *
    
    @F.udf(ArrayType(StringType()))
    def gen_array(day1, day2):
      return ['' for i in range(day2-day1+1)]
    
    df.withColumn(
      "dup", 
      F.explode(
        gen_array(F.col("day1"), F.col("day2"))
      )
    ).drop("dup").show()
    
    +---+----+----+
    | id|day1|day2|
    +---+----+----+
    |  1|   2|   4|
    |  1|   2|   4|
    |  1|   2|   4|
    |  2|   1|   2|
    |  2|   1|   2|
    |  3|   3|   3|
    +---+----+----+
    

    【讨论】:

      【解决方案2】:

      另一个使用rdd.flatMap的选项:

      df.rdd.flatMap(lambda r: [r] * (r.day2 - r.day1 + 1)).toDF().show()
      +---+----+----+
      | id|day1|day2|
      +---+----+----+
      |  1|   2|   4|
      |  1|   2|   4|
      |  1|   2|   4|
      |  2|   1|   2|
      |  2|   1|   2|
      |  3|   3|   3|
      +---+----+----+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-01
        • 2016-04-01
        • 2016-02-14
        • 1970-01-01
        • 2014-05-14
        • 1970-01-01
        • 2018-05-19
        • 2016-06-12
        相关资源
        最近更新 更多