Scala 如何在Spark 2中生成N秒差的随机时间戳?
我需要在我的数据帧中生成一个带有随机时间戳的新列,该列的步长为秒。数据帧包含10.000行。 开始时间戳应为Scala 如何在Spark 2中生成N秒差的随机时间戳?,scala,apache-spark,Scala,Apache Spark,我需要在我的数据帧中生成一个带有随机时间戳的新列,该列的步长为秒。数据帧包含10.000行。 开始时间戳应为1516364153。 我试着解决这个问题如下: df.withColumn("timestamp",lit(1516364153 + scala.util.Random.nextInt(2000))) 但是,所有时间戳都等于某个特定值,例如,1516364282,而不是许多不同的值。可能存在一些重复项,但为什么所有值都相同?看起来只生成了一个随机数,然后它传播到整个列 如何解决此问题?
1516364153
。
我试着解决这个问题如下:
df.withColumn("timestamp",lit(1516364153 + scala.util.Random.nextInt(2000)))
但是,所有时间戳都等于某个特定值,例如,1516364282
,而不是许多不同的值。可能存在一些重复项,但为什么所有值都相同?看起来只生成了一个随机数,然后它传播到整个列
如何解决此问题?如本答案所述:
随机数总是一样的原因可能是它是一样的
在数据分区之前使用种子创建和初始化
因此,一个可能的解决方案是使用UDF:
import org.apache.spark.sql.functions
val randomTimestamp = functions.udf((s: Int) => {
s + scala.util.Random.nextInt(2000)
})
然后在withColumn方法中使用它:
df.withColumn("timestamp", randomTimestamp(lit(1516364153)))
我在火花壳中进行了快速测试:
原始数据帧:
+-----+-----+
| word|value|
+-----+-----+
|hello| 1|
|hello| 2|
|hello| 3|
+-----+-----+
输出:
+-----+-----+----------+
| word|value| timestamp|
+-----+-----+----------+
|hello| 1|1516364348|
|hello| 2|1516364263|
|hello| 3|1516365083|
+-----+-----+----------+
如本答复所述:
随机数总是一样的原因可能是它是一样的
在数据分区之前使用种子创建和初始化
因此,一个可能的解决方案是使用UDF:
import org.apache.spark.sql.functions
val randomTimestamp = functions.udf((s: Int) => {
s + scala.util.Random.nextInt(2000)
})
然后在withColumn方法中使用它:
df.withColumn("timestamp", randomTimestamp(lit(1516364153)))
我在火花壳中进行了快速测试:
原始数据帧:
+-----+-----+
| word|value|
+-----+-----+
|hello| 1|
|hello| 2|
|hello| 3|
+-----+-----+
输出:
+-----+-----+----------+
| word|value| timestamp|
+-----+-----+----------+
|hello| 1|1516364348|
|hello| 2|1516364263|
|hello| 3|1516365083|
+-----+-----+----------+
只需使用
rand
:
import org.apache.spark.sql.functions.rand
df.withColumn("timestamp", (lit(1516364153) + rand() * 2000)).cast("long"))
只需使用
rand
:
import org.apache.spark.sql.functions.rand
df.withColumn("timestamp", (lit(1516364153) + rand() * 2000)).cast("long"))
nextInt(2000)生成一个介于0到1999之间的随机数。因此,如果你得到一个随机的0,你将得到重复的值。@Praveen:不,所有时间戳的值都是相同的:
1516364282
。random.nextInt(2000)生成一个0到1999之间的随机数。因此,如果您得到一个随机的0,您将得到重复的0。@Praveen:不,所有时间戳的值都是相同的:1516364282
。这可能是答案,但RNG不能像这样使用。这可能是答案,但RNG不能像这样使用。谢谢您的代码片段,它可能会提供一些有限的即时帮助。通过展示为什么这是一个很好的问题解决方案,A将极大地提高它的长期价值,并将使它对未来有其他类似问题的读者更有用。请在您的回答中添加一些解释,包括您所做的假设。当我执行这段代码时,我得到了值1.5163641530446012E9
@Markus,您是否尝试过df.withColumn(“timestamp”,lit(1516364153)+scala.util.Random.nextInt(2000))
?@RameshMaharjan:不,实际上它再次生成了相同的值。感谢您提供的这段代码片段,它可能会提供一些有限的即时帮助。通过展示为什么这是一个很好的问题解决方案,A将极大地提高它的长期价值,并将使它对未来有其他类似问题的读者更有用。请在您的回答中添加一些解释,包括您所做的假设。当我执行此代码时,我得到值1.5163641530446012E9
@Markus,您是否尝试df.withColumn(“timestamp”,lit(1516364153)+scala.util.Random.nextInt(2000))
?@RameshMaharjan:不,实际上它再次生成相同的值。