Apache spark Spark-广播HashMap并在转换中使用它
目前在转换中,我正在读取一个文件并创建一个HashMap,它是一个静态字段,用于重用 对于我需要对照HashMap检查的每个记录,是否包含相应的键。如果它与记录键匹配,则从HashMap获取值 最好的方法是什么 我应该广播这个HashMap并在转换中使用它吗?[Apache spark Spark-广播HashMap并在转换中使用它,apache-spark,Apache Spark,目前在转换中,我正在读取一个文件并创建一个HashMap,它是一个静态字段,用于重用 对于我需要对照HashMap检查的每个记录,是否包含相应的键。如果它与记录键匹配,则从HashMap获取值 最好的方法是什么 我应该广播这个HashMap并在转换中使用它吗?[HashMap或ConcurrentHashMap] DoesBroadcast将确保HashMap始终包含该值 有没有像HashMap变为空这样的场景,我们也需要处理该检查?[如果是空的,请再次加载] 更新: 基本上,我需要使用Hash
HashMap
或ConcurrentHashMap
]
DoesBroadcast
将确保HashMap
始终包含该值
有没有像HashMap变为空这样的场景,我们也需要处理该检查?[如果是空的,请再次加载]
更新:
基本上,我需要使用HashMap作为转换内部的查找。最好的方法是什么?广播还是静态变量
当我对少数记录使用静态变量时,我没有从HashMap中获得正确的值。HashMap只包含100个元素。但我将其与2500万条记录进行比较。首先,一个
广播
变量只能用于读取目的,而不能作为一个全局
变量,该变量可以在经典编程(一个线程、一台计算机、过程编程等)中修改。事实上,您可以在代码中使用全局变量,并且可以在其中的任何部分使用它(甚至在映射
)中),但决不能修改
正如您在这里看到的,它们提高了性能,因为在所有节点中都有数据的缓存副本,这样可以避免将相同的对象反复传输到每个节点
广播变量允许程序员保留只读变量
缓存在每台计算机上,而不是随任务一起发送副本
比如说
rdd=sc.parallelize(范围(1000))
广播=sc.broadcast({“数字”:1,“值”:4})
rdd=rdd.map(λx:x+broadcast.value[“value”])
rdd.collect()
正如您所见,在每次转换迭代中,我都会访问字典中的值。您应该广播变量。
使变量为静态将导致类被序列化和分发,而您可能不希望这样 当我在转换中调用Broadcast.value时,它会返回相同的HashMap还是为每一行创建新的HashMap?我已经用我正在查看的内容更新了我的问题。请检查它。“当前在转换中,我正在读取一个文件并创建HashMap,它是一个静态字段,用于重复使用”。那么,你是说你正试图为每个转换创建一个广播变量?!警察局。我建议您发布一个小的代码示例,这样我可以更好地理解您的问题,实际上它有点模糊。