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。“
任何有关如何处理广播变量的帮助都会很棒!
答案 0 :(得分:13)
通过在map
lambda中引用包含广播变量的对象,Spark将尝试序列化整个对象并将其发送给工作人员。由于该对象包含对SparkContext的引用,因此会出现错误。而不是:
pairs = distinct_users_projected.map(lambda x: (x.user_id, pt.broadcast_products_lookup_map.value[x.Prod_ID]))
试试这个:
bcast = pt.broadcast_products_lookup_map
pairs = distinct_users_projected.map(lambda x: (x.user_id, bcast.value[x.Prod_ID]))
后者避免引用对象(pt
),因此Spark只需要发送广播变量。