生成唯一的遞增數值
本文向您展示如何使用Apache Spark函數在列中生成唯一的遞增數值。
我們回顧三種不同的使用方法。您應該選擇最適合您的用例的方法。
使用zipWithIndex ()
在彈性分布式數據集中(RDD)
的zipWithIndex ()
函數僅在rdd內可用。你不能直接在數據幀上使用它。
將您的DataFrame轉換為RDD,應用zipWithIndex ()
然後將RDD轉換回DataFrame。
我們將使用下麵的示例代碼向一個有兩個條目的基本表添加唯一id號。
df=火花.createDataFrame([(“愛麗絲”,“十”),(“蘇珊”,“12”)),[“名字”,“年齡”])df1=df.抽樣.zipWithIndex().toDF()df2=df1.選擇(上校(“_1。*”),上校(“_2”).別名(“increasing_id”))df2.顯示()
運行示例代碼,我們得到以下結果:
+-----+---+-------------+| |名字年齡| increasing_id |+-----+---+-------------+|Alice| 10| 0|蘇珊| 12| 1|+-----+---+-------------+
使用monotonically_increasing_id ()
用於唯一的,但不是連續的數字
的monotonically_increasing_id ()
函數生成單調遞增的64位整數。
生成的id號保證是遞增的且唯一的,但不保證是連續的。
我們將使用下麵的示例代碼向一個有兩個條目的基本表單調遞增添加id號。
從pyspark.sql.functions進口*df_with_increasing_id=df.withColumn(“monotonically_increasing_id”,monotonically_increasing_id())df_with_increasing_id.顯示()
運行示例代碼,我們得到以下結果:
+-----+---+---------------------------+| |名字年齡| monotonically_increasing_id |+-----+---+---------------------------+|愛麗絲| 10| 8589934592||蘇珊| 12| 25769803776|+-----+---+---------------------------+
結合monotonically_increasing_id ()
與row_number ()
對於兩列
的row_number ()
函數生成連續的數。
將此與monotonically_increasing_id ()
生成兩列可用於識別數據條目的數字。
我們將使用下麵的示例代碼將id號和行號單調遞增地添加到一個有兩個條目的基本表中。
從pyspark.sql.functions進口*從pyspark.sql.window進口*窗口=窗口.orderBy(上校(“monotonically_increasing_id”))df_with_consecutive_increasing_id=df_with_increasing_id.withColumn(“increasing_id”,row_number().在(窗口))df_with_consecutive_increasing_id.顯示()
運行示例代碼,我們得到以下結果:
+-----+---+---------------------------+-------------+| |名字年齡| monotonically_increasing_id | increasing_id |+-----+---+---------------------------+-------------+|愛麗絲| 10| 8589934592| 1||蘇珊| 12| 25769803776| 2|+-----+---+---------------------------+-------------+
如果需要根據最近更新的最大值進行遞增,則可以定義之前的最大值,然後從那裏開始計數。
我們將在剛才運行的示例代碼上進行構建。
首先,我們需要定義值previous_max_value
.通常通過從現有的輸出表中獲取值來實現這一點。在本例中,我們將其定義為1000。
previous_max_value=1000df_with_consecutive_increasing_id.withColumn(“cnsecutiv_increase”,上校(“increasing_id”)+點燃(previous_max_value)).顯示()
當這與前麵的示例代碼結合並運行時,我們得到以下結果:
+-----+---+---------------------------+-------------+------------------+| |名字年齡| monotonically_increasing_id | increasing_id | cnsecutiv_increase |+-----+---+---------------------------+-------------+------------------+|Alice| 10| 8589934592| 1| 1001||蘇珊| 12| 25769803776| 2| 1002|+-----+---+---------------------------+-------------+------------------+