Spark: variables de difusión: parece que está intentando hacer referencia a SparkContext desde una variable de difusión, una acción o una transformación

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])) 

Obtuve el siguiente error:

“Excepción: parece que está intentando hacer referencia a SparkContext desde una variable de transmisión, acción o transforamtion. SparkContext solo se puede usar en el controlador, no en el código que se ejecuta en los trabajadores. Para obtener más información, consulte SPARK-5063”.

¡Cualquier ayuda sobre cómo lidiar con las variables de transmisión será excelente!

Al hacer referencia al objeto que contiene su variable de transmisión en su map lambda, Spark intentará serializar todo el objeto y enviarlo a los trabajadores. Como el objeto contiene una referencia al SparkContext, aparece el error. En lugar de esto:

 pairs = distinct_users_projected.map(lambda x: (x.user_id, pt.broadcast_products_lookup_map.value[x.Prod_ID])) 

Prueba esto:

 bcast = pt.broadcast_products_lookup_map pairs = distinct_users_projected.map(lambda x: (x.user_id, bcast.value[x.Prod_ID])) 

Este último evita la referencia al objeto ( pt ), por lo que Spark solo necesita enviar la variable de difusión.