如何在Spark 2中生成N秒差异的随机时间戳?

时间:2018-02-10 09:59:22

标签: scala apache-spark

我需要在我的DataFrame中生成一个具有随机时间戳的新列,该时间戳将具有几秒的步长。 DataFrame包含10.000行。 起始时间戳应为1516364153。 我试着按如下方式解决问题:

df.withColumn("timestamp",lit(1516364153 + scala.util.Random.nextInt(2000)))

但是,所有时间戳都等于某个特定值,例如1516364282而不是许多不同的值。可能有一些重复,但为什么所有值都相同?看起来只生成了一个随机数,然后它在整个列上传播。

我该如何解决这个问题?

2 个答案:

答案 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|
+-----+-----+