【发布时间】:2022-01-27 10:28:56
【问题描述】:
Class ProdsTransformer:
def __init__(self):
self.products_lookup_hmap = {}
self.broadcast_products_lookup_map = None
def create_broadcast_variables(self):
self.broadcast_products_lookup_map = sc.broadcast(self.products_lookup_hmap)
def create_lookup_maps(self):
// The code here builds the hashmap that maps Prod_ID to another space.
pt = ProdsTransformer ()
pt.create_broadcast_variables()
pairs = distinct_users_projected.map(lambda x: (x.user_id,
pt.broadcast_products_lookup_map.value[x.Prod_ID]))
我收到以下错误:
“例外:您似乎正在尝试引用 来自广播变量、动作或转换的 SparkContext。 SparkContext 只能在驱动程序上使用,不能在它运行的代码中使用 对工人。有关详细信息,请参阅 SPARK-5063。”
任何关于如何处理广播变量的帮助都会很棒!
【问题讨论】:
-
代码和/或示例数据不足以让某人尝试复制错误和/或修复它。另外,如果您没有注意到,所有缩进都会从 python 中删除。
-
我添加了更多代码。
-
我想知道如果您将
products_lookup_map从ProdsTransformer实例的属性中移出并改为全局属性,该错误是否会消失。您需要多张地图吗? -
我需要多张地图。
-
好的,我认为错误的意思是在工作人员中禁止调用
sc或rdd 函数,即在map()、flatmap()、reduce()等任何火花函数中....您只能在主程序中调用sc.something。因此,例如,您可以链接地图,但不能在地图中包含地图。显然广播是受到这种限制的。我已经看到 spark mangle 自定义类,因此有一些从正在移动的序列化数据中重新创建工人的类实例。
标签: python apache-spark pyspark