我需要在我的DataFrame中生成一个具有随机时间戳的新列,该时间戳将具有几秒的步长。 DataFrame包含10.000行。
起始时间戳应为1516364153
。
我试着按如下方式解决问题:
df.withColumn("timestamp",lit(1516364153 + scala.util.Random.nextInt(2000)))
但是,所有时间戳都等于某个特定值,例如1516364282
而不是许多不同的值。可能有一些重复,但为什么所有值都相同?看起来只生成了一个随机数,然后它在整个列上传播。
我该如何解决这个问题?
答案 0 :(得分:4)
只需使用rand
:
import org.apache.spark.sql.functions.rand
df.withColumn("timestamp", (lit(1516364153) + rand() * 2000)).cast("long"))
答案 1 :(得分:1)
如本回答所述[{3}}:
随机数始终相同的原因可能是它 在数据被分区之前用种子创建和初始化。
因此,一种可能的解决方案是使用UDF:
updating
然后在withColumn方法中使用它:
import org.apache.spark.sql.functions
val randomTimestamp = functions.udf((s: Int) => {
s + scala.util.Random.nextInt(2000)
})
我在df.withColumn("timestamp", randomTimestamp(lit(1516364153)))
:
原始数据框架:
spark-shell
输出:
+-----+-----+
| word|value|
+-----+-----+
|hello| 1|
|hello| 2|
|hello| 3|
+-----+-----+