如何使用Spark 2.1将联合数据帧并行化为一个数据帧

时间:2019-08-01 03:32:06

标签: scala apache-spark apache-spark-sql

我希望将数据合并到另一个数据帧的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)}

1 个答案:

答案 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()