如何在RDD中分配固定的UUID值

时间:2016-03-25 07:41:33

标签: scala apache-spark uuid rdd

在火花程序中,我首先初始化了2个RDD,然后在while循环中使用第二个RDD,如下所示:

var nodes = sc.parallelize(ArrayBuffer(1, 2, 3, 4, 5))
var node_GroupIDs = nodes.map(x=>(x, UUID.randomUUID()))
var i = 0

while (i < 10) {
    node_GroupIDs.foreach(println)
    i += 1
}

我在不同的迭代中发现某个节点ID,相应的组ID具有不同的值。似乎在每次迭代中RDD已经再次初始化。 在这种情况下,如何为节点分配固定的UUID值?

1 个答案:

答案 0 :(得分:2)

我建议您缓存RDD以便始终获得相同的结果。实际上,正在发生的事情是每次有一个动作时重新计算RDD:即每次调用public Clock() { initComponents(); Calendar cal = new GregorianCalendar(); int second = cal.get(Calendar.SECOND); int minute = cal.get(Calendar.MINUTE); int hour = cal.get(Calendar.HOUR_OF_DAY); ///////////////////////////////////////////////////////////// if (second < 10){ time.setText(" "+hour+": "+minute+":0"+second+""); } else if (minute < 10){ time.setText(" "+hour+":0"+minute+": "+second+""); } else if (hour < 10){ time.setText("0"+hour+": "+minute+": "+second+""); } else if (hour < 10 & minute < 10){ time.setText("0"+hour+":0 "+minute+": "+second+""); } else if (minute < 10 & second < 10){ time.setText(" "+hour+":0"+minute+":0"+second+""); } else if (hour < 10 & minute < 10 & second < 10){ time.setText("0"+hour+":0"+minute+":0"+second+""); } else { time.setText(hour + " : " + minute + " : " + second+""); } //////////////////////////////////////////////////////////////// } 方法时,每一步都从头开始重新计算,{{ {1}}和foreach

如果parallelize之后的map RDD,则会在第一次调用cache操作时计算一次。然后结果保存在内存中,其他map操作将读取缓存在内存中的结果,您将得到相同的结果。

正如@David Griffin指出的那样,如果遗嘱执行人崩溃,这将无法解决问题。为了涵盖这种情况,在缓存之后需要foreach(请参阅https://issues.apache.org/jira/browse/SPARK-8582)。

因此,解决问题的正确方法应该是:

foreach