目前在转换中我正在读取一个文件并创建一个HashMap,它是一个用于重用目的的静态字段。
对于我需要根据HashMap检查的每条记录<>是否包含相应的密钥。如果它与记录键匹配,则从HashMap获取值。
这样做的最佳方式是什么?
我应该广播这个HashMap并在Transformation中使用它吗? [HashMap
或ConcurrentHashMap
]
Broadcast
会确保HashMap
始终包含值。
是否有任何类似HashMap的场景变空,我们还需要处理该检查? [如果它再次空载]
更新
基本上我需要使用HashMap作为转换内的查找。什么是最好的方法?广播或静态变量?
当我对几个记录使用静态变量时,我没有从HashMap获得正确的值.HashMap只包含100个元素。但我将其与2500万条记录进行比较。
答案 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)
你应该广播变量。 使变量静态将导致类被序列化和分发,您可能不希望这样。