Мне нужно написать функцию, которая принимает строку и выполняет итерацию по ключу серии, парам значений и возвращает строку замены. То, как у меня сейчас это есть, жестко запрограммировано и написано в PySpark:
import pyspark.sql.function as f
def replace(s):
s = f.regexp_replace(s, '.*one.*', '1')
s = f.regexp_replace(s, '.*two.*', '2')
s = f.regexp_replace(s, '.*three.*', '3')
return s
Эта функция выполняется в нескольких сценариях, и я хотел бы сохранить один список ключей, замен значений, а не поддерживать несколько жестко закодированных версий. Эта функция может быть в конечном итоге построена с использованием библиотеки python.
import re
def replace(s):
s = re.sub('.*one.*', '1', s)
s = re.sub('.*two.*', '2', s)
s = re.sub('.*three.*', '3', s)
return s
Мне нужно переписать это так, чтобы этот процесс был построен из файла json или импортированного объекта python на местном уровне. Порядок этих замен имеет значение (если у меня есть строка «два один три», я хочу, чтобы она была заменена на «1». Я хотел бы услышать отзывы о том, является ли файл json или импорт лучшей практикой, но в этот момент я буду импортировать объект в файл с именем replacements.py.
replacements = [
['.*one.*', '1'],
['.*two.*', '2'],
['.*three.*', '3']
]
, а затем я смогу построить эту функцию таким образом, но меня беспокоит, что каждый раз, когда я запускаю его столбец PySpark, он будет ссылаться на каждый раз заменяющий объект.
from replacements import replacements
import pyspark.sql.functions as f
def replace(s):
for pair in replacements:
s = f.regexp_replace(s, pair[0], pair[1])
return s
Но я мог бы также использовать метод создания функции, которая возвращает исходную функцию.
from replacements import replacements
import pyspark.sql.functions as f
def build_replace(ls):
def replace(s):
for pair in replacements:
s = f.regexp_replace(s, pair[0], pair[1])
return s
return replace
replace = build_replace(replacements)
Теоретически (и в идеале) он будет считывать из «замен» только один раз при построении функции, и тогда эта функция будет по существу жестко закодирована, как и оригинал. Я хотел бы знать, получаю ли я желаемый «жестко закодированный» эффект и если между этими двумя способами есть разница в производительности, или если есть лучшее решение, о котором я не знаю.
Заранее спасибо! * 101 8 *