Создайте столбец pyspark из большого количества регистров с регулярным выражением - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь преобразовать сложное текстовое поле в одно из ~ 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 не обрабатывает большие функции. Есть ли другое решение?

...