Ошибка при передаче широковещательной переменной в UDF, Pyspark

У меня есть функция, которая пытается передать широковещательную переменную в UDF.

Функция выглядит так:

def generate_lookup_code(self, lookup_map):

    lookup_map_broadcast = spark_session.sparkContext.broadcast(lookup_map)
    print("lookup_map has been broadcasted")

    #### UDF function only return a constant string###
    def _generate_code(bc_reasoncode_lookup_map):

        reasoncode_lookup_map = bc_reasoncode_lookup_map.value
        return "hello"


    udfGenerateCode = F.udf(_generate_code, StringType())

    input_df = input_df.withColumn('code', udfGenerateCode(lookup_map_broadcast))

    input_df.show()

Мое намерение - только попытаться передать широковещательную переменную в UDF, однако я получил ошибку:

'Broadcast' object has no attribute '_get_object_id'

Понятия не имею, где не так?

1 ответ

Вам не нужно передавать широковещательную переменную как аргумент UDF, просто обратитесь к ней из функции:

lookup_map_broadcast = spark_session.sparkContext.broadcast(lookup_map)

def _generate_code():
    reasoncode_lookup_map = lookup_map_broadcast.value
    return "hello"

udfGenerateCode = F.udf(_generate_code, StringType())
input_df = input_df.withColumn('code', udfGenerateCode())

UDF вызывается для каждой строки и может принимать столбец или литерал.

Другие вопросы по тегам