代码之家  ›  专栏  ›  技术社区  ›  Steven

仅使用一个窗口函数生成组ID

  •  1
  • Steven  · 技术社区  · 8 年前

    我正在尝试为我的表分配一个组ID。
    对于“部分”列中的每个组,根据“ord”列中的顺序,“id”列中遇到的第一个元素将收到一个新的\u id 0,然后每次遇到不同的id时,我都会增加“新的\u id”。

    目前,我需要使用两个窗口函数,因此过程非常缓慢。

    df = sqlContext.createDataFrame(
      [
        (1,1,'X'),
        (1,2,'X'),
        (1,3,'X'),
        (1,4,'Y'),
        (1,5,'Y'),
        (1,6,'Y'),
        (1,7,'X'),
        (1,8,'X'),
        (2,1,'X'),
        (2,2,'X'),
        (2,3,'X'),
        (2,4,'Y'),
        (2,5,'Y'),
        (2,6,'Y'),
        (2,7,'X'),
        (2,8,'X'),
      ],
      ["part", "ord", "id"]
    )
    
    df.withColumn(
      "new_id", 
      F.lag(F.col("id")).over(Window.partitionBy("part").orderBy("ord"))!=F.col('id')
    ).withColumn(
      "new_id", 
      F.sum(
        F.col("new_id").cast('int')
      ).over(Window.partitionBy("part").orderBy("ord"))
    ).na.fill(0).show()
    
    +----+---+---+------+
    |part|ord| id|new_id|
    +----+---+---+------+
    |   2|  1|  X|     0|
    |   2|  2|  X|     0|
    |   2|  3|  X|     0|
    |   2|  4|  Y|     1|
    |   2|  5|  Y|     1|
    |   2|  6|  Y|     1|
    |   2|  7|  X|     2|
    |   2|  8|  X|     2|
    |   1|  1|  X|     0|
    |   1|  2|  X|     0|
    |   1|  3|  X|     0|
    |   1|  4|  Y|     1|
    |   1|  5|  Y|     1|
    |   1|  6|  Y|     1|
    |   1|  7|  X|     2|
    |   1|  8|  X|     2|
    +----+---+---+------+
    

    我能只用一个窗口功能实现同样的功能吗?

    0 回复  |  直到 8 年前
    推荐文章