我定义了一个函数:
def setJsonPushIndex(spark: SparkSession, currentdate: String, jsonPushInfo: RDD[(String, String)]): RDD[String] =
{
val sc = spark.sparkContext
val acc = new LongAccumulator()
sc.register(acc, "myaccumulator")
val jsonPushWithIndex = jsonPushInfo.map(x =>
{
acc.add(1)
val sendhour = x._2.toString
val index = pushUtil.toIndex(acc.value.toString)
var mid = "BI" + currentdate + sendhour + index
if (sendhour.toInt < pushUtil.getNextHour().toInt)
{
mid = "BI" + pushUtil.getNextday() + sendhour + index
}
mid + "\u0001" +
"\"mid\": " + "\"" + mid + "\"," +
x._1
}
)
jsonPushWithIndex
}
然后我在主函数中调用
: val json_push_res = setJsonPushIndex(spark, currentdate, json_pushInfo)
val jsonResultPath= "/jc/algorithm/NewUserPushTest/results/" + pushUtil.NowDate() + "/"
json_push_res.take(12).foreach(println)
json_push_res.saveAsTextFile(jsonResultPath)
事实证明,我的目录“ part-00000”中只有一个分区。 我的命令是
spark-submit --master yarn --num-executors 5 --executor-cores 2 --executor-memory 5G --driver-memory 10G --class "apppush.NewUserPush_V2" /home/ilambda/lyj/test2.jar
结果数约为30000。
结果数是否很小,因为最后只有一个分区,或者Accumulator
导致了这个结果?
答案 0 :(得分:0)
使用Accumulators
不会影响DAG
,因此不会引起改组或合并。
因为jsonPushInfo
仅使用窄变换进行处理
jsonPushInfo.map(x =>
...
)
它也不会更改分区数。
因此,我们可以得出结论,jsonPush
从一开始就只有一个分区。