Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在Spark 2中生成N秒差的随机时间戳?_Scala_Apache Spark - Fatal编程技术网

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

Scala 如何在Spark 2中生成N秒差的随机时间戳?,scala,apache-spark,Scala,Apache Spark,我需要在我的数据帧中生成一个带有随机时间戳的新列,该列的步长为秒。数据帧包含10.000行。 开始时间戳应为1516364153。 我试着解决这个问题如下: df.withColumn("timestamp",lit(1516364153 + scala.util.Random.nextInt(2000))) 但是,所有时间戳都等于某个特定值,例如,1516364282,而不是许多不同的值。可能存在一些重复项,但为什么所有值都相同?看起来只生成了一个随机数,然后它传播到整个列 如何解决此问题?

我需要在我的数据帧中生成一个带有随机时间戳的新列,该列的步长为秒。数据帧包含10.000行。 开始时间戳应为
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:不,实际上它再次生成相同的值。