저장소에 포함한 설정 파일 읽기
변환과 함께 버전 관리하는 YAML, CSV와 텍스트 파일을 Python 패키지에 포함하면 실행 환경에서도 읽을 수 있습니다. 입력 데이터셋과 별개로 변환 매개변수나 작은 설정 목록을 코드와 함께 배포할 때 사용하는 방식입니다.
패키지에 파일 포함하기
Python 모듈의 setup.py에 있는 setup() 호출에서 기존 인자를 유지하고 다음 package_data 인자를 추가합니다. 이미 해당 인자가 있으면 기존 패턴에 필요한 확장자를 합칩니다.
package_data={
"": ["*.yaml", "*.csv"]
},
빈 문자열 키는 모든 패키지에 패턴을 적용합니다. .txt 파일도 배포하려면 목록에 "*.txt"를 추가합니다. 저장소에 파일을 올리는 것만으로 패키지에 자동 포함된다고 가정하지 않습니다.
다음처럼 Python 패키지 안에서 변환 모듈과 설정 파일을 나란히 둡니다.
src/
myproject/
__init__.py
datasets/
__init__.py
read_yml.py
config.yaml
config.yaml의 예시는 다음과 같습니다. tbl1, col1, col2, col3과 XXX는 가상의 설정 값입니다.
- name: tbl1
primaryKey:
- col1
- col2
update:
- column: col3
with: 'XXX'
변환에서 읽기
환경에 pyyaml을 추가합니다. importlib.resources.files()로 현재 패키지의 설정 파일을 열고 yaml.safe_load()로 읽습니다. 이 방식은 패키지를 일반 디렉터리뿐 아니라 압축된 형태로 가져오는 환경에도 대응합니다.
read_yml.py:
from importlib.resources import files
import json
import yaml
from transforms.api import Output, transform_df
@transform_df(Output("/Example Project/Outputs/configuration"))
def compute(ctx):
config = files(__package__).joinpath("config.yaml")
with config.open("r", encoding="utf-8") as stream:
settings = yaml.safe_load(stream)
return ctx.spark_session.createDataFrame(
[{"result": json.dumps(settings, ensure_ascii=False)}]
)
출력에는 result 문자열 열과 한 행이 생깁니다. 해당 문자열의 JSON 값은 다음과 같습니다.
[{"name":"tbl1","primaryKey":["col1","col2"],"update":[{"column":"col3","with":"XXX"}]}]
files()는 Python 3.9부터 제공되며 이 예제는 __init__.py가 있는 일반 패키지를 사용합니다. pkg_resources는 Setuptools 82에서 제거되었으므로 새 패키지 리소스 접근에는 importlib.resources를 사용합니다.
설정 파일을 바꿨을 때 해당 변환도 다시 계산되어야 한다면 변환 로직 버전 관리의 tllvFiles 설정에 해당 파일을 포함합니다. 패키지 포함 여부와 변경을 감지할 파일 목록은 서로 다른 설정입니다.