Я пытаюсь преобразовать сложное текстовое поле в одно из ~ 2000 возможных значений на основе регулярных выражений и условий.
Пример: если VAL1 in ('3025', '4817') и re.match ('foo', VAL2), то (123, "GROUP_ABX")
elif ... (повторите около 2000 уникальных сценариев)
Я поместил этот набор условий в массивную функцию pySpark UDF. Проблема в том, что если у меня более нескольких сотен условий, производительность останавливается.
UDF зарегистрирован так:
schema = StructType([
StructField("FOO_ID", IntegerType(), False),
StructField("FOO_NAME", StringType(), False)])
spark.udf.register("FOOTagging", FOOTag, schema)
test_udf = udf(FOOTag, schema)
датафрейм обновляется как:
df1 = spark.read.csv(file)\
.toDF(*Fields)\
.select(*FieldList)\
.withColumn("FOO_TAG_STRUCT", test_udf('VAL1','VAL2'))
Когда я запускаю с условиями <200, я обрабатываю файл строки 23k за пару секунд. Когда я получаю более 500 или около того, это занимает вечность. </p>
Кажется, UDF не обрабатывает большие функции. Есть ли другое решение?