我有一个数据框,必须在其中一列中生成唯一的ID。此ID必须使用偏移量生成。 因为,我需要使用自动生成的ID保留此数据框,现在,如果自动生成的ID中包含新数据,则不应与现有数据冲突。 我检查了单调递增函数,但不接受任何偏移量。 这就是我尝试过的:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="parentElement">
<div id="childElement">
</div>
</div>
但是有没有办法使monotonically_increasing_id()从起始偏移量开始?
答案 0 :(得分:3)
或者,如果您不想使用df.coalesce(1)
将程序限制在一个分区中,则可以使用zipWithIndex
,其下标为index = 0,如下所示:
lines = [["a1", "a2", "a3"],
["b1", "b2", "b3"],
["c1", "c2", "c3"]]
cols = ["c1", "c2", "c3"]
df = spark.createDataFrame(lines, cols)
start_indx = 10
df = df.rdd.zipWithIndex() \
.map(lambda (r, indx): (indx + start_indx, r[0], r[1], r[2])) \
.toDF(["id", "c1", "c2", "c3"])
df.show(10, False)
在这种情况下,我设置了start_index = 10
。这将是输出:
+---+---+---+---+
|id |c1 |c2 |c3 |
+---+---+---+---+
|10 |a1 |a2 |a3 |
|11 |b1 |b2 |b3 |
|12 |c1 |c2 |c3 |
+---+---+---+---+
答案 1 :(得分:0)
您可以简单地添加它以提供ID的最小值。请注意,不能保证这些值将从最小值开始
.withColumn("id", monotonically_increasing_id + 123)
说明:https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/Column.scala#L642列的操作符+
已超载