Spark - 广播HashMap并在转换中使用它

时间:2016-02-15 13:43:16

标签: apache-spark

目前在转换中我正在读取一个文件并创建一个HashMap,它是一个用于重用目的的静态字段。

对于我需要根据HashMap检查的每条记录<>是否包含相应的密钥。如果它与记录键匹配,则从HashMap获取值。

这样做的最佳方式是什么?

我应该广播这个HashMap并在Transformation中使用它吗? [HashMapConcurrentHashMap]

Broadcast会确保HashMap始终包含值。

是否有任何类似HashMap的场景变空,我们还需要处理该检查? [如果它再次空载]

更新

基本上我需要使用HashMap作为转换内的查找。什么是最好的方法?广播或静态变量?

当我对几个记录使用静态变量时,我没有从HashMap获得正确的值.HashMap只包含100个元素。但我将其与2500万条记录进行比较。

2 个答案:

答案 0 :(得分:3)

首先,broadcast变量只能用于阅读目的,而不能用作global变量,可以在经典编程中修改(一个线程,一台计算机,程序编程等) ...)。实际上,您可以在代码中使用全局变量,并且可以在其中的任何部分使用它(甚至在maps内),但从不修改。

正如您在此处Advantages of broadcast variables所见,它们提升了性能,因为在所有节点中都有一个缓存的数据副本,这样可以避免重复地将object重复传输到每个节点。

  

广播变量允许程序员保留只读变量   缓存在每台机器上,而不是随副本运送它的副本。

例如。

rdd = sc.parallelize(range(1000))
broadcast = sc.broadcast({"number":1, "value": 4})

rdd = rdd.map(lambda x: x + broadcast.value["value"]) 
rdd.collect()

正如您所看到的,我在转换的每次迭代中都访问了字典中的值。

答案 1 :(得分:0)

你应该广播变量。 使变量静态将导致类被序列化和分发,您可能不希望这样。