【问题标题】:Pyspark: how to add a column with the row number?Pyspark:如何添加带有行号的列?
【发布时间】:2020-05-17 22:06:12
【问题描述】:

我有一个 pyspark 数据框。我想添加一个包含行号的列。

这就是我正在做的事情

stop_df = stop_df.withColumn("stop_id", monotonically_increasing_id())

如果我检查stop_id 的最大值,我得到

stop_df.agg(max("stop_id")).show()
+--------------+
|  max(stop_id)|
+--------------+
|32478542692458|
+--------------+

而行数是

stop_df.count()
Out[4]: 8134605

【问题讨论】:

  • 请注意,数据库自动增量(或 Oracle 中的“序列”)不保证增量是连续的。出于性能原因,ID 由块分配,因此可能永远不会使用块末尾的 ID。部分失败将导致一些块被完全丢弃。 RDBMS 保证唯一性、单调性(虽然并发事务可能使用重叠的 ID),但不保证连续性。

标签: python apache-spark pyspark


【解决方案1】:

来自 spark monotonically_increasing_id docs:

生成单调递增的 64 位整数rs的列。

生成的 ID 保证单调递增且 唯一的,但不是连续的。当前的实现将 高 31 位的分区 ID,以及每个分区内的记录号 分区在低 33 位。假设是数据框 少于10亿个分区,每个分区少于8个 十亿条记录。

使用window row_number函数获取行号。

df=spark.createDataFrame([("a",),("b",)],["id"])
from pyspark.sql.window import Window
from pyspark.sql.functions import *
#add partition by and order by clause if ordering required with in window.
w=Window.orderBy(lit(1))

df.withColumn("stop_id",row_number().over(w)).show()
#+---+-------+
#| id|stop_id|
#+---+-------+
#|  a|      1|
#|  b|      2|
#+---+-------+

df.withColumn("stop_id",row_number().over(w)).agg(max("stop_id")).show()
#+------------+
#|max(stop_id)|
#+------------+
#|           2|
#+------------+

df.count()
#2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多