我希望将数据合并到另一个数据帧的foreach循环中的一个数据帧中,但是似乎丢失了一些数据。
是否有一些解决方案来解决我的情况?下面的代码示例:
/ ** set master(“ local [*]”)将丢失数据, 设置master(“ local [1]”)不会丢失数据。** /
object testParallelizeDF extends App {
import scala.util.Random
import org.apache.spark.sql.SparkSession
//val spark = SparkSession.builder().master("local[1]").getOrCreate()//not lost data
val spark = SparkSession.builder().master("local[*]").getOrCreate()//lost data
import spark.implicits._
val values0 = List(1, 2, 3, 4, 5)
var df0 = values0.toDF
df0.repartition(5)
val values = List(1, 2, 3, 4, 5)
var df = values.toDF
df0.foreachPartition(p => {
p.foreach(r => {
val ran = Random.nextInt()
println(p.hashCode() + "==>" + r.toString() + "==>" + ran)
df = df.union(List(ran).toDF)
})
})
df.collect().foreach(println)}
答案 0 :(得分:1)
联合DataFrames
在默认情况下是并行的,您不应尝试将其放在执行者端代码中(它将不起作用)。另外,请尝试避免使用具有副作用的代码,请使用mapPartitions
/ map
而不是foreachPartition
/ foreach
:
val randomDF = df0.mapPartitions(p => {
val randomInts = p.map(r => {
val ran = Random.nextInt()
println(p.hashCode() + "==>" + r.toString() + "==>" + ran)
ran
})
randomInts
}).toDF()
df.union(randomDF).collect().foreach(println)}
您还可以生成如下的随机数:
val randomDF = List.fill(df0.count.toInt)(Random.nextInt()).toDF()