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