如何为连续运行中生成的连续数据帧的列生成连续唯一ID

时间:2019-04-11 13:59:33

标签: scala apache-spark scd2

我正在Spark Scala中使用SCDTYPE2,因此我的代码每天都会创建一个新的数据框,并且我每天每天创建数据框时都需要知道如何标记新的唯一ID。

我尝试使用monotonically_increasing_id()函数来创建唯一的ID。但它会在每个数据帧中生成唯一ID。但它并非每次运行都唯一。每次运行都会重复相同的唯一ID。

我还尝试使用monotonically_increasing_id val DF2 =DF1.withColumn("key1",((date_format(col("date_column"), "ddmmyy")*24*60+ date_format(col("date_column"), "HHmmss")*60 + monotonically_increasing_id())*(-1)).cast(IntegerType)).withColumn("key2",$"key1".cast(StringType)).withColumn("date1",(date_format(col("date_column"), "ddmmyy")*24*60)).withColumn("date2",(date_format(col("date_column"), "HHmmss")*60 )).withColumn("id",monotonically_increasing_id()*(-1)).select($"date_column",$"date1",$"date2",$"id",$"key1",$"key2") 在我的数据框中使用时间戳列创建唯一的ID,但它以双倍数据类型提供输出,并且我已经转换回整数/字符串,但是对ID进行了四舍五入并生成了重复项ID。

SELECT *
FROM MyTable
WHERE (NAME LIKE '%' + @Name + '%' OR @Name IS NULL)
  AND (ACCOUNT_NO = @AccountNumber OR @AccountNumber IS NULL)
OPTION( RECOMPILE);

我希望无论数据帧的生成如何,都应生成唯一的ID。如果有人可以指出正确的方向,那将会有所帮助。

2 个答案:

答案 0 :(得分:0)

检出uuid模块:https://docs.python.org/3/library/uuid.html

您可以将uuid.uuid4()用于完全随机的ID。或uuid.uudi1()获取更复杂的定性ID。

答案 1 :(得分:0)

请参阅我对这个问题How to implement Slowly Changing Dimensions (SCD2) Type 2 in Spark的回答

这解决了所有问题,您也可以看到问题的答案。

相关问题