Apache spark 避免在没有缓存的spark中对代码进行惰性计算

Apache spark 避免在没有缓存的spark中对代码进行惰性计算,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,如何避免spark中的惰性评估。我有一个需要立即填充的数据框,因为我需要根据为每行数据框生成的随机数过滤数据,比如说,如果生成的随机数>0.5,它将被过滤为dataA,如果生成的随机数=0.5) val DATB=randomNumberDF.filter(列(“数值”)

如何避免spark中的惰性评估。我有一个需要立即填充的数据框,因为我需要根据为每行数据框生成的随机数过滤数据,比如说,如果生成的随机数>0.5,它将被过滤为dataA,如果生成的随机数<0.5,它将被过滤为dataB

val randomNumberDF = df.withColumn("num", Math.random())
val dataA = randomNumberDF.filter(col("num") >= 0.5)
val dataB = randomNumberDF.filter(col("num") < 0.5)
这些并没有解决问题

请提出不同于缓存/持久化/将数据写入HDFS并再次将其作为解决方案读取的建议

我已经检查过的参考资料:


如果您要寻找的只是一种方法来确保相同的值在
randomNumberDF.num
中,那么您可以使用种子生成随机数(使用
org.apache.spark.sql.functions.rand()
):

下面使用112作为种子值:

val randomNumberDF = df.withColumn("num", rand(112))
val dataA = randomNumberDF.filter(col("num") >= 0.5)
val dataB = randomNumberDF.filter(col("num") < 0.5)
val randomNumberDF=df.withColumn(“num”,rand(112))
val dataA=randomNumberDF.filter(列(“数值”)>=0.5)
val DATB=randomNumberDF.filter(列(“数值”)<0.5)

这将确保
num
中的值在
randomNumberDF

的多个求值过程中是相同的。除了使用
org.apache.spark.sql.functions.rand
和给定的种子外,还可以使用急切检查点:

df.checkpoint(true)

这将把数据帧具体化到磁盘

这是什么
Math.random()
?同时使用检查点,它将再次计算,并且数据的具体化不会发生。我加了一句:randomNumberDF.checkpoint(true),还有其他方法可以使用吗?@NehaKumari,你试过这个吗
randomNumberDF=randomNumberDF.checkpoint(true)
问题不在于相同的随机数值,而在于重新计算data@NehaKumari如果数据帧没有被持久化,它将被重新计算(不可能两者都有)。我的理解是,您希望避免缓存,但在许多评估中都有一个可预测的分布。由于您没有缓存,因此在任何操作中,甚至都会重新计算
df
本身。
df.checkpoint(true)